使用 Flutter 加速應(yīng)用開發(fā)

作者 / Larry McKenzie
本文由 eBay 技術(shù)負責(zé)人 Larry Mckenzie 和 Corey Sprague 撰寫。您可以收聽他們在 Google Apps, Games & Insights 播客 中的討論,詳細了解如何使用 Flutter 構(gòu)建應(yīng)用。
構(gòu)建原生應(yīng)用本來就不輕松,如果需要在不到一年的時間內(nèi)構(gòu)建出一款應(yīng)用,同時還要滿足目標(biāo)受眾的嚴(yán)格要求,就更加困難了。我們在構(gòu)建 eBay Motors 應(yīng)用時,就遇到了這樣的挑戰(zhàn)。但在 Google 的界面工具包 Flutter 的幫助下,我們得以快速針對 Android 和 iOS 平臺提供優(yōu)質(zhì)且一致的體驗。
eBay Motors
過去十幾年來,eBay 在汽車市場的業(yè)務(wù)一直十分活躍。但在幾年前,我們的領(lǐng)導(dǎo)層發(fā)現(xiàn)了一個機遇: 我們可以在 eBay 平臺提供定制化的車輛買賣服務(wù)。購買汽車不同于大多數(shù)在線購物: 購車是一項較為重大的消費,而且銷售過程中存在一些特殊的問題需要考慮。eBay 傾向于上架經(jīng)典車型、稀有車型、改裝車等獨特品類的車輛。eBay賣家往往想要為自己的愛車找到真正懂得欣賞和珍惜的買家。很多 eBay 買賣雙方都在尋找更加個性化、更為獨特的服務(wù),所以我們想為這些用戶構(gòu)建一款特殊的應(yīng)用——eBay Motors 應(yīng)用便應(yīng)運而生。
目標(biāo)受眾
eBay Motors 的目標(biāo)受眾是廣大汽車愛好者。盡管愛好者們每天都會關(guān)注汽車,但可能幾年才會買一次車。因此,打造一款能夠讓他們愿意定期使用的應(yīng)用并不容易。開發(fā)團隊著重研究了這些人的使用動機,以及他們希望與其他汽車愛好者互動的方式。
買家可能正在物色下一輛車,或者只是隨便看看或?qū)ふ异`感。在考慮購買車輛時,買家希望在決定購買之前充分獲取相關(guān)信息。他們希望能夠從各個角度查看車輛 - 內(nèi)飾、外觀、發(fā)動機、傳動系統(tǒng)。他們想了解車況,也想了解賣家。當(dāng)前車主的用車情況怎樣?他們每天都開車嗎?車輛是否在修理廠維修拋光過?車輛是每年行駛一次,只在車展上展出嗎?我們想構(gòu)建一種可以充分滿足這些需求的體驗。
開發(fā)團隊在與賣家談?wù)摮鍪圮囕v方面的問題時,發(fā)現(xiàn)賣家明顯格外關(guān)心買家是誰,而并非總是關(guān)心價格。一些賣家表示,如果他們覺得買家真的會悉心呵護他們的愛車,那么降價出售并非不可接受。這種態(tài)度與傳統(tǒng)汽車市場大相徑庭,在傳統(tǒng)汽車市場中,賣家總是希望能夠以最高價格出售車輛。
在調(diào)查中,人們認(rèn)為買賣雙方的關(guān)系并沒有在交易達成后就結(jié)束。賣家希望能夠跟蹤愛車情況,并繼續(xù)與他們的買家交流。買家同樣希望保持聯(lián)系,以便詢問: "嗨,我想改裝這里,但我發(fā)現(xiàn)你之前改裝過其他部位。可以給我講講具體情況嗎?" 因此,我們希望構(gòu)建一些功能,使買賣雙方形成一個不僅僅只是討論交易的社區(qū)。
選擇 Flutter
在開發(fā)這款應(yīng)用時,eBay Motors 的領(lǐng)導(dǎo)層為開發(fā)團隊提供了很大的自主權(quán)。唯一的要求是: 這款應(yīng)用必須在一年內(nèi)完成開發(fā)。根據(jù)我們的調(diào)查,顯然這款應(yīng)用必須包含 eBay 用戶所期望的全部功能: 巨細無遺的商品詳情頁、拍賣、消息功能、搜索等。開發(fā)團隊還積極地添加了有助于培養(yǎng)活躍社區(qū)的功能。這意味著我們的工作范圍十分龐雜,我們認(rèn)為,如果依然沿用兩支獨立平臺開發(fā)團隊的模式,將無法在截止日期前完成任務(wù)。
顯然,我們需要一種新的應(yīng)用開發(fā)方法。開發(fā)團隊之前對跨平臺開發(fā)工具進行過一些評估,但并沒有找到令我們滿意的解決方案。
但在這個項目開始時,F(xiàn)lutter 1.0 發(fā)布了。Flutter 是 Google 的界面工具包,可基于單個代碼庫為移動、網(wǎng)絡(luò)和桌面端構(gòu)建富有吸引力的原生編譯應(yīng)用。這看起來很有前景,所以我們的開發(fā)團隊開始了更加詳細的調(diào)查。
對 Flutter 進行徹底的評估后,開發(fā)團隊對其相當(dāng)滿意。短短幾周內(nèi),開發(fā)團隊便確信 Flutter 是開發(fā)這款應(yīng)用的最佳選擇。
eBay Motors 之前組建了兩支開發(fā)團隊,分別采用不同的工作方式、工作安排和編程風(fēng)格。在決定使用 Flutter 時,必須弄清楚應(yīng)該如何協(xié)調(diào)兩支開發(fā)團隊。由于時間緊迫,因此開發(fā)團隊在如何構(gòu)建應(yīng)用方面必須達成一致。所有人都秉持著相同的目標(biāo) - 打造高品質(zhì)的產(chǎn)品、快速交付并超越預(yù)期。
兩支團隊開會討論了所有分歧,盡管雙方各有讓步,但最終結(jié)果非常協(xié)調(diào),這也為順利發(fā)布產(chǎn)品做好了充分準(zhǔn)備。
兩支團隊都缺乏 Flutter 和 Dart 的使用經(jīng)驗,但官方提供的指引非常詳盡,學(xué)習(xí)起來非常簡單。
首個版本
我們在 2019 年 3 月收到了第一份產(chǎn)品需求——我們需要在三個月內(nèi)向我們的 CEO 交付包含可用交易體驗的 Beta 版應(yīng)用。
第一個版本需求因為時間緊張,迫使團隊大幅削減應(yīng)用的功能。我們知道,即便在 Flutter 的幫助下,我們也不可能一次性解決所有問題——無法構(gòu)建出包含所有買賣功能的完整社區(qū)和完善的消息功能。我們必須制定合理的開發(fā)策略,確定需要優(yōu)先開發(fā)的重點功能,而非同時開發(fā)所有功能。團隊通過討論削減哪些功能,總結(jié)出了大量關(guān)注重點。這樣我們就確定了研究重點,以及隨之而來的開發(fā)重點。每個微小變化都會解鎖下一個變化,使我們共同朝著里程碑一步步邁進。我們積極地關(guān)注問題,專注地解決用戶希望我們處理的細節(jié)。這一過程困難且常常凌亂不堪,但在 Flutter 的強力助推下,我們以意想不到的方式加速追趕上了一個個任務(wù)節(jié)點。每到達一個節(jié)點,團隊都會為之振奮。
實現(xiàn)首個里程碑之后,我們還要攻克多個后續(xù)里程碑,而 Flutter 使得我們能夠一次性解決問題,并繼續(xù)向前邁進。我們的產(chǎn)品從交付給 CEO 的 Beta 版發(fā)展為 eBay 內(nèi)測 Beta 版,供數(shù)千名 eBay 用戶使用。一個月后,我們的產(chǎn)品進入了公開 Beta 版測試階段。終于,我們于 2019 年 12 月底正式發(fā)布了 iOS 和 Android 版應(yīng)用。
對于 eBay Motors 而言,每個時刻都意義非凡。開發(fā)團隊也通過這些時刻一步步地建立了信心。將產(chǎn)品交付給新用戶、獲得反饋,并進行更正和調(diào)整,我們可謂 "邊做邊學(xué)"。朝著目標(biāo)快速地交付小規(guī)模迭代,也有助于我們的產(chǎn)品團隊取得成功。即使應(yīng)用的功能和復(fù)雜程度不斷提高,F(xiàn)lutter 也讓我們能夠持續(xù)快速地交付產(chǎn)品。
由于在發(fā)布時大幅削減了應(yīng)用功能,導(dǎo)致此時我們并沒有聊天和社區(qū)功能。因此,在 2020 年 1 月,開發(fā)團隊著手從零開始構(gòu)建我們的社區(qū),并在發(fā)布后的幾個月內(nèi)增加了 50% 的應(yīng)用功能。
Flutter 的影響
在剛開始采用 Flutter 時,我們只是將其視為一種支持共享代碼并節(jié)省時間的工程工具。但 Flutter 幫助開發(fā)團隊解決了許多我們并未期待它能解決的問題。在某些情況下,它甚至解決了我們未知的問題。
我們希望確保用戶界面在各個平臺之間的一致性: 將用戶體驗重點凝聚在 eBay Motors 品牌上,而非迎合特定平臺的設(shè)計語言。但是,產(chǎn)品必須保留所在平臺的具體行為,例如滾動的物理效果以及導(dǎo)航機制。幸運的是,F(xiàn)lutter 以開箱即用的方式使這些問題迎刃而解。這意味著設(shè)計師可以省去很多工作,因為他們只需要制作一份與平臺無關(guān)的設(shè)計即可。
在產(chǎn)品需求方面,我們希望平臺之間不存在差異。由于每項需求只需實現(xiàn)一次,所以減輕了我們不少的負擔(dān)。我們開會的次數(shù)減少了,事半功倍。
隨著開發(fā)團隊對 Flutter 的了解日益加深,我們意識到,代碼共享可謂意義非凡。在我們的代碼庫中,我們在 Android 和 iOS 之間共享了 98.6% 的代碼。只有大約 0.5% 的代碼為平臺特定的原生代碼。其余部分包括我們的持續(xù)集成流水線、自動化工具和開發(fā)者支持。
在開發(fā)過程中,通過共享代碼可以節(jié)省大量資金,而在測試方面也同樣如此。在開發(fā)團隊曾使用過的所有平臺當(dāng)中,F(xiàn)lutter 在測試方面是佼佼者之一。它的測試功能幫助我們加快了進度,并讓我們在發(fā)布產(chǎn)品時信心十足。我們從一開始就采取了強制執(zhí)行 100% 代碼覆蓋率的策略,F(xiàn)lutter 讓我們能夠輕松實現(xiàn)這一目標(biāo)。
隨著應(yīng)用進入生產(chǎn)階段,節(jié)省資金的優(yōu)勢也在持續(xù)體現(xiàn)。由于我們不必單獨處理 iOS 或 Android 錯誤,因此支持內(nèi)容的可預(yù)測性要高得多。開發(fā)團隊可以將新的版本發(fā)布到更具包容性的 Android 測試版渠道,之后再充滿信心地發(fā)布 iOS 版本。由于只需構(gòu)建和支持一個應(yīng)用,我們能夠節(jié)省大量資金。
Flutter 入門技巧
如果是初上手 Flutter,在解決移動應(yīng)用中的某些問題的時候,必須擺脫先入為主的觀念,因為 Flutter 所使用的范式與傳統(tǒng) iOS 和 Android 截然不同。當(dāng)您理解了 Flutter 所用的應(yīng)用構(gòu)建方式后,一切都將水到渠成。最好的學(xué)習(xí)方法是花些時間研究 Flutter 代碼庫。
Flutter 的一大優(yōu)點就是開源。您可以查看 Flutter 團隊是如何構(gòu)建每個組件的,從中可以收獲很多有價值的信息。
Flutter 社區(qū)也非常活躍。如果您需要 Flutter 框架尚未提供的解決方案,那么很可能已經(jīng)有人構(gòu)建了解決這個問題的 package。我們鼓勵您的團隊探索并查找所需信息,也歡迎您貢獻自己的專業(yè)知識并積極擁抱開源文化。
Flutter 的前景
在 eBay Motors 剛開始使用 Flutter 時,還鮮有大型公司公開使用該框架: 它當(dāng)時僅是一款小眾工具包,似乎還缺乏實戰(zhàn)檢驗。時至今日,這個框架勢頭愈發(fā)強勁,很多公司向其敞開了懷抱。令人興奮的是,F(xiàn)lutter 提供了最為現(xiàn)代且最為優(yōu)秀的應(yīng)用開發(fā)體驗。而最棒的一點是,它仍在不斷地發(fā)展與改進。
隨著 Flutter 的發(fā)展,Dart 得到了大量的資源投入。Swift 和 Kotlin 中諸如空安全等一些必不可少的特性得到了積極的引入。看到 Flutter 的持續(xù)發(fā)展,以及這種發(fā)展為構(gòu)建 Flutter 應(yīng)用所帶來的改進,我們感到十分喜悅。無論公司體量大小,當(dāng)大家逐漸意識到 Flutter 可以幫助他們基于單個代碼庫開發(fā)桌面、web 和移動端應(yīng)用,自然也會有更多團隊采用 Flutter。
結(jié)語
雖然 eBay Motors 開發(fā)團隊的所有成員都擁有原生 iOS 或原生 Android 開發(fā)背景,但在用過 Flutter 之后,所有人都不約而同地喜歡上了它。Flutter 的開發(fā)者體驗明顯好于以往: 它可以利用熱重載功能讓開發(fā)者在進行編碼時就獲得快速反饋,而且由于開發(fā)流程的順暢,使得問題能夠快速得到解決,這些都是非常有價值的優(yōu)勢。在兩年的使用過程中,驚喜無處不在。我們常能聽到同事大喊: "我愛 Flutter!我剛發(fā)現(xiàn)了一個新的妙招!"
對于我們這樣規(guī)模的團隊,如果沒有選擇 Flutter,就沒辦法完成 eBay Motors 應(yīng)用的開發(fā)。它讓我們能夠?qū)①Y源集中到一起,這是分別構(gòu)建兩個平臺應(yīng)用的模式所無法實現(xiàn)的。Flutter 是幫助我們加快開發(fā)進程的加速器。

更多 Google Play 開發(fā)者播客節(jié)目,請移步《Apps, Games & Insights 播客節(jié)目合輯》,了解不同領(lǐng)域的開發(fā)者通過多種視角與主題,探討海外市場開發(fā)與發(fā)行的經(jīng)驗心得。
您對使用 Flutter 構(gòu)建應(yīng)用有何想法?歡迎在評論區(qū)分享您的評論。
posted on 2021-04-06 09:44 Flutter社區(qū) 閱讀(127) 評論(0) 收藏 舉報
浙公網(wǎng)安備 33010602011771號