Flutter for Android 開發者

Views

Flutter和Android中的View

在Flutter中,View相當於是Widget。然而,與View相比,Widget有一些不同之處。 首先,Widget僅支持一幀,並且在每一幀上,Flutter的框架都會創建一個Widget實例樹(譯者語:相當於一次性繪製整個界面)。 相比之下,在Android上View繪製結束後,就不會重繪,直到調用invalidate時纔會重繪。

與Android的視圖層次系統不同(在framework改變視圖),而在Flutter中的widget是不可變的,這允許widget變得超級輕量。

如何更新widget

在Android中,您可以通過直接對view進行改變來更新視圖。然而,在Flutter中Widget是不可變的,不會直接更新,而必須使用Widget的狀態。State對象,它可以跨幀存儲狀態數據並恢復它。

如何佈局? XML layout 文件跑哪去了?

在Android中,您通過XML編寫佈局,但在Flutter中,您可以使用widget樹來編寫佈局。

如何在佈局中添加或刪除組件

在Android中,您可以從父級控件調用addChild或removeChild以動態添加或刪除View。 在Flutter中,因爲widget是不可變的,所以沒有addChild。但是,您可以傳入一個函數,該函數返回一個widget給父項,並通過布爾值控制該widget的創建。

在Android中,可以通過View.animate()對視圖進行動畫處理,那在Flutter中怎樣才能對Widget進行處理

在Flutter中,可以通過動畫庫給widget添加動畫。

在Android中,您可以通過XML創建動畫或在視圖上調用.animate()。在Flutter中,您可以將widget包裝到Animation中。

與Android相似,在Flutter中,您有一個AnimationController和一個Interpolator, 它是Animation類的擴展,例如CurvedAnimation。您將控制器和動畫傳遞到AnimationWidget中,並告訴控制器啓動動畫。

如何使用Canvas draw/paint

在Android中,您可以使用Canvas在屏幕上繪製自定義形狀。

Flutter有兩個類可以幫助您繪製畫布,CustomPaint和CustomPainter,它們實現您的算法以繪製到畫布。

如何構建自定義 Widgets

在Android中,您通常會繼承View或已經存在的某個控件,然後覆蓋其繪製方法來實現自定義View。

在Flutter中,一個自定義widget通常是通過組合其它widget來實現的,而不是繼承。

Intents

Intent在Flutter中等價於什麼?

在Android中,Intents主要有兩種使用場景:在Activity之間切換,以及調用外部組件。 Flutter不具有Intents的概念,但如果需要的話,Flutter可以通過Native整合來觸發Intents。

要在Flutter中切換屏幕,您可以訪問路由以繪製新的Widget。 管理多個屏幕有兩個核心概念和類:Route 和 Navigator。Route是應用程序的“屏幕”或“頁面”的抽象(可以認爲是Activity), Navigator是管理Route的Widget。Navigator可以通過push和pop route以實現頁面切換。

和Android相似,您可以在AndroidManifest.xml中聲明您的Activities,在Flutter中,您可以將具有指定Route的Map傳遞到頂層MaterialApp實例

如何在Flutter中處理來自外部應用程序傳入的Intents

Flutter可以通過直接與Android層通信並請求共享的數據來處理來自Android的Intents

在這個例子中,我們註冊文本共享intent,所以其他應用程序可以共享文本到我們的Flutter應用程序

這個應用程序的基本流程是我們首先處理Android端的共享文本數據,然後等待Flutter請求數據,然後通過MethodChannel發送。

startActivityForResult 在Flutter中等價於什麼

處理Flutter中所有路由的Navigator類可用於從已經push到棧的路由中獲取結果。 這可以通過等待push返回的Future來完成。例如,如果您要啓動讓用戶選擇其位置的位置的路由,則可以執行以下操作:

Map coordinates = await Navigator.of(context).pushNamed('/location');

然後在你的位置路由中,一旦用戶選擇了他們的位置,你可以將結果”pop”出棧

Navigator.of(context).pop({"lat":43.821757,"long":-79.226392});

異步UI

runOnUiThread 在Flutter中等價於什麼

Dart是單線程執行模型,支持Isolates(在另一個線程上運行Dart代碼的方式)、事件循環和異步編程。 除非您啓動一個Isolate,否則您的Dart代碼將在主UI線程中運行,並由事件循環驅動(譯者語:和JavaScript一樣)。例如,您可以在UI線程上運行網絡請求代碼而不會導致UI掛起(譯者語:因爲網絡請求是異步的)。

AsyncTask和IntentService在Flutter中等價於什麼

在Android中,當你想訪問一個網絡資源時,你通常會創建一個AsyncTask,它將在UI線程之外運行代碼來防止你的UI被阻塞。 AsyncTask有一個線程池,可以爲你管理線程。

由於Flutter是單線程的,運行一個事件循環(如Node.js),所以您不必擔心線程管理或者使用AsyncTasks、IntentServices。

要異步運行代碼,可以將函數聲明爲異步函數,並在該函數中等待這個耗時任務。

在Android上,當您繼承AsyncTask時,通常會覆蓋3個方法,OnPreExecute、doInBackground和onPostExecute。 在Flutter中沒有這種模式的等價物,因爲您只需等待一個長時間運行的函數,而Dart的事件循環將負責其餘的事情。

但是,有時您可能需要處理大量數據,導致UI可能會掛起。

在這種情況下,與AsyncTask一樣,在Flutter中,可以利用多個CPU內核來執行耗時或計算密集型任務。這是通過使用Isolates來完成的。

是一個獨立的執行線程,它運行時不會與主線程共享任何內存。這意味着你不能從該線程訪問變量或通過調用setState來更新你的UI。

項目結構和資源

在哪裏存儲分辨率相關的圖片文件? HDPI/XXHDPI

Flutter遵循像iOS這樣簡單的3種分辨率格式: 1x, 2x, and 3x.

創建一個名爲images的文件夾,併爲每個圖像文件生成一個@2x和@3x文件,並將它們放置在如下這樣的文件夾中

…/my_icon.png

…/2.0x/my_icon.png
…/3.0x/my_icon.png
然後,您需要在pubspec.yaml文件中聲明這些圖片

assets:
 - images/a_dot_burr.jpeg
 - images/a_dot_ham.jpeg

然後您可以使用AssetImage訪問您的圖像

return new AssetImage("images/a_dot_burr.jpeg");

在哪裏存儲字符串? 如何存儲不同的語言

目前,最好的做法是創建一個名爲Strings的類

class Strings{
  static String welcomeMessage = "Welcome To Flutter";
}

然後在你的代碼中,你可以像訪問你的字符串一樣:

new Text(Strings.welcomeMessage)

Flutter對Android的可訪問性提供了基本的支持,雖然這個功能正在進行中。

鼓勵Flutter開發者使用intl package 進行國際化和本地化。

如何監聽Android Activity生命週期事件

在Android中,您可以覆蓋Activity的方法來捕獲Activity的生命週期回調。

在Flutter中您可以通過掛接到WidgetsBinding觀察並監聽didChangeAppLifecycleState更改事件來監聽生命週期事件

您可以監聽到的生命週期事件是

  • resumed - 應用程序可見並響應用戶輸入。這是來自Android的onResume
  • inactive -應用程序處於非活動狀態,並且未接收用戶輸入。此事件在Android上未使用,僅適用於iOS
  • paused -應用程序當前對用戶不可見,不響應用戶輸入,並在後臺運行。這是來自Android的暫停
  • suspending -該應用程序將暫時中止。這在iOS上未使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章