開發集成環境
[✓] Flutter (Channel stable, v1.12.13+hotfix.9, on Mac OS X 10.14.6 18G103, locale zh-Hans-CN)
一、簡述Flutter集成到Android原生項目
二、Android原生以AAR形式集成Flutter項目
三、Flutter與原生(Android/IOS)的消息通信
四、Flutter中如何使用原生控件/組件
五、Flutter狀態管理Provider與Redux
六、Flutter升級及開發中遇到的問題彙總
此前記錄的關於升級到Flutter V1.12與之前版本異同點
-
不需要在Application中初始化
去除
FlutterMain.startInitialization(this);
初始化方法。 io.flutter.facade包已移除,flutterView不再建議使用
-
原來的FlutterActivity包路徑替換
由
io.flutter.app.FlutterActivity
替換成io.flutter.embedding.android.FlutterActivity
-
修改啓動FlutterActivity方法
官方啓動方式:
startActivity( FlutterActivity .withNewEngine() .initialRoute("/test") .build(currentActivity) );
稍微走進FlutterActivity源碼你會發現:
@NonNull public static NewEngineIntentBuilder withNewEngine() { return new NewEngineIntentBuilder(FlutterActivity.class); } protected NewEngineIntentBuilder(@NonNull Class<? extends FlutterActivity> activityClass) { this.activityClass = activityClass; } @NonNull public Intent build(@NonNull Context context) { return new Intent(context, activityClass) .putExtra(EXTRA_INITIAL_ROUTE, initialRoute) .putExtra(EXTRA_BACKGROUND_MODE, backgroundMode) .putExtra(EXTRA_DESTROY_ENGINE_WITH_ACTIVITY, true); }
可以看出這個withNewEngine方法傳的一直都是FlutterActivity.class,然後new一個NewEngineIntentBuilder,而NewEngineIntentBuilder的構造函數是protected,不是子類沒法直接new。那隻好繼承NewEngineIntentBuilder這個類,重寫它的構造函數。
改造如下:
public class MyFlutterActivity extends FlutterActivity { public static void openFlutter(Activity activity, String routerUrl){ Intent intent = MyFlutterActivity.withNewEngine() .initialRoute(routerUrl) .build(activity); //主要加入這句話實現透明Activity //intent.putExtra("background_mode","transparent"); activity.startActivity(intent); } public static AhsEngineIntentBuilder withNewEngine() { return new AhsEngineIntentBuilder(MyFlutterActivity.class); } public static AhsEngineIntentBuilder withNewEngine(Class<? extends FlutterActivity> activityClass) { return new AhsEngineIntentBuilder(activityClass); } public static class AhsEngineIntentBuilder extends NewEngineIntentBuilder { protected AhsEngineIntentBuilder(Class<? extends FlutterActivity> activityClass) { super(activityClass); } } }
-
啓動FlutterActivity過渡的圖片
爲了啓動了FlutteActivity後加載flutter過程中顯示的圖片,沒設置一般是白屏或者黑屏。
如果你之前設置了android:name="io.flutter.app.android.SplashScreenUntilFirstFrame".
需要移除掉.添加如下代碼:
<!-- 在所在的activity中加入 --> <meta-data android:name="io.flutter.embedding.android.SplashScreenDrawable" android:resource="@drawable/placehold_background" />
-
flutter出現黑屏無法顯示
需要在flutter的main函數中,runApp前調用如下方法即可:
void main() { WidgetsFlutterBinding.ensureInitialized(); runApp(MyApp()); }
-
MethodChannel的應用
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler()
改成:
MethodChannel(flutterEngine.dartExecutor, CHANNEL).setMethodCallHandler()