在已有Android原生工程基础上集成Flutter Module。
先说坑
新版flutter SDK已经移除了Flutter.java这个类。因此你想通过Flutter.createView(MainActivity.this,getLifecycle(),"yourRouter");来构建视图是行不通了。
具体步奏
1、使用Android Studio构建Module
创建module成功后,Android Studio会自动引入这个module,无需修改项目配置。
2、配置module路由
void main() { runApp(MyApp(window.defaultRouteName)); // APP初始化 } class MyApp extends StatefulWidget { final String router; MyApp(this.router); @override State<StatefulWidget> createState() => MyOSCClientState(); } class MyOSCClientState extends State<MyApp> { Color themeColor = ThemeUtils.currentColorTheme; @override void initState() { super.initState(); DataUtils.getColorThemeIndex().then((index) { print('color theme index = $index'); if (index != null) { ThemeUtils.currentColorTheme = ThemeUtils.supportColors[index]; Constants.eventBus .fire(ChangeThemeEvent(ThemeUtils.supportColors[index])); } }); Constants.eventBus.on<ChangeThemeEvent>().listen((event) { setState(() { themeColor = event.color; }); }); } @override Widget build(BuildContext context) { switch(widget.router){ case '西天取经'://路由1 return MaterialApp(debugShowCheckedModeBanner: false, // 右上角debug标签 theme: ThemeData(primaryColor: themeColor), home: Page1()); default: return MaterialApp(debugShowCheckedModeBanner: false, // 右上角debug标签 theme: ThemeData(primaryColor: themeColor), home: Container()); } } }
3、配置主工程
3.1配置androidmanifest.xml,把FlutterActivity加进去
<activity android:name="io.flutter.embedding.android.FlutterActivity" android:theme="@style/Theme.imgFullScreen" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize" />
3.2跳转到flutter module指定页面
startActivity(FlutterActivity.withNewEngine().initialRoute("西天取经").build(mActivity));
单纯的跳转这样就可以了。
还有一种情况是生成Fragment来显示。如下(注:这种情况我是照搬flutter文档的,没有尝试,如果有报错请移步官方文档自行查验)
FlutterFragment flutterFragment = FlutterFragment.withNewEngine()
.initialRoute("myInitialRoute/")
.build();