21.原生專案和Flutter的混合開發(二)

CoorChice發表於2019-03-19

目錄傳送門:《Flutter快速上手指南》先導篇

混合開發(一) 中,我們成功的在原生 Android 專案中引入了 Flutter,本篇我們看看如何讓 Flutter 在原生 Android 應用中執行起來。

1. 改造 main.dart

首先,要讓 Flutter 的檢視能展示,需要改造一下 main.dart ,根據 name 的來建立對應的 Widget。

import 'dart:ui';
import 'package:flutter/material.dart';

void main() => runApp(_widgetForRoute(window.defaultRouteName));

Widget _widgetForRoute(String route) {
  switch (route) {
    case 'route1':
      return SomeWidget(...);
    case 'route2':
      return SomeOtherWidget(...);
    default:
      return Center(
        child: Text('Unknown route: $route', textDirection: TextDirection.ltr),
      );
  }
}
複製程式碼

在上面的例子中,通過 window 物件獲取了 defaultRouteName,這個值是由原生 Android 傳遞過來的。

在 Flutter 中,Window 是平臺使用者介面的抽象,其中包含了平臺的屬性。

2. 建立 FlutterView

Flutter 使用 FlutterView 來作為容器,顯示 Flutter 的檢視。

FlutterView 實際上是一個 SurfaceView (這是個坑比較多的 View),Flutter 會將內容直接繪製到 SurfaceView 上。

效能理論上來說,比 Android 提供的原生 View 肯定會高。

看看如何建立一個 FlutterView 吧:

FlutterView flutterView = Flutter.createView(
   activity,
   getLifecycle(),
   "route0"
);
複製程式碼

喔,它看起來很簡單。

最後一個引數 route0 就對應著前面所說的 window.defaultRouteName 的值了。

需要注意的是,在建立 FlutterView 的時候,需要提供一個 Lifecycle,用於監聽 Activity 的生命週期。

因此,你可以直接使用 AppCompatActivity,它已經包含了一個 Lifecycle 例項。

或者,你可以自己建立一個 Lifecycle,就像下面這樣:

public class SupportActivity extends Activity implements LifecycleOwner {

  private LifecycleRegistry lifecycle = new LifecycleRegistry(this);
}
複製程式碼

FlutterView 作為一個 SurfaceView 的子類,它也是一個 View。

因此,你可以將它設定的足夠大,用來作為一個頁面。

也可以根據需要,直接插入到現有 ViewTree 的任何一個節點,作為 Android 原生頁面中的一個 View。

靈活性還是很高的,總之就像使用一個原生的View一樣使用它就好了。

下面的 gif 就是一個由原生 Android 應用跳轉到 Flutter 頁面的例子:

3. 繼續使用 Hot-Reload

你可能會擔心,和原生的Android混合開發了之後,Hot-Reload 會不會不能用了?

當然不會!你仍然可以繼續享用 Hot-Reload 帶來的良好編譯開發體驗。

// 進入你的 FlutterModule 目錄
$ cd some/path/my_flutter
// 執行 attach
$ flutter attach
Waiting for a connection from Flutter on Nexus 5X...
複製程式碼

接著,在裝置上啟動你的專案,然後進入到使用了 Flutter 的頁面,控制檯就會出現以下資訊:

Done.
Syncing files to device Nexus 5X...                          5.1s

?  To hot reload changes while running, press "r". To hot restart (and rebuild state), press "R".
An Observatory debugger and profiler on Nexus 5X is available at: http://127.0.0.1:59556/
For a more detailed help message, press "h". To quit, press "q".
複製程式碼

現在,當你在 FlutterModule 中有任何的修改,只需要按下 r 就能看到變化。

在這種環境下,你可以有以下幾種操作:

命令功能
rreload(熱過載)
Rrestart(熱重啟)
q退出

目錄傳送門:《Flutter快速上手指南》先導篇

如何找到我?

傳送門:CoorChice 的主頁

傳送門:CoorChice 的 Github



相關文章