最近flutter不是一般的火呀,但对于一些成熟的产品来说,完全摒弃原有App的历史沉淀,全面转向Flutter是不现实的。因此使用Flutter去统一Android、iOS技术栈,把它作为已有原生App的扩展能力,通过有序推进来提升移动端的开发效率
(1)创建flutter模块,创建module后会AS会自动进行flutter的相关配置
(2)将FlutterActivity添加到AndroidManifest.xml
1 <activity 2 android:name="io.flutter.embedding.android.FlutterActivity" 3 android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" 4 android:hardwareAccelerated="true" 5 android:theme="@style/FlutterTheme" 6 android:windowSoftInputMode="adjustResize" />
(3)跳转到flutter页面
startActivity(FlutterActivity.withNewEngine().initialRoute("route").build(this))
(4)你也可以使用缓存的FlutterEngine,可以减少加载延迟
在MyApplication中实例化一个FlutterEngine
1class MyApplication : Application() { 2 3 4 lateinit var flutterEngine: FlutterEngine 5 override fun onCreate() { 6 7 8 super.onCreate() 9 flutterEngine = FlutterEngine(this) 10 flutterEngine.dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault()) 11 FlutterEngineCache.getInstance().put("my_engine_id", flutterEngine) 12 } 13}
然后在Activity中跳转
1 btn.setOnClickListener { 2 3 4 startActivity(FlutterActivity.withCachedEngine("my_engine_id").build(this)) 5 }
注意:使用withCachedEngine()工厂方法时,请传递与缓存所需的ID相同的ID FlutterEngine
设置缓存引擎时也可以初始路由,修改MyApplication
1 flutterEngine = FlutterEngine(this) 2 flutterEngine.navigationChannel.setInitialRoute("route") //可以借此携带一些字符串数据,可传递到flutter页面 3 flutterEngine.dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault()) 4 FlutterEngineCache.getInstance().put("my_engine_id", flutterEngine)
对应的dart
1import 'dart:ui'; 2import 'package:flutter/material.dart'; 3 4void main() => runApp(MyApp()); 5 6class MyApp extends StatelessWidget { 7 8 9 @override 10 Widget build(BuildContext context) { 11 12 13 return MaterialApp( 14 title: 'Flutter Demo', 15 theme: ThemeData( 16 primarySwatch: Colors.blue, 17 ), 18 home: _widgetForRoute(window.defaultRouteName), 19 ); 20 } 21} 22 23//路由的选择 24Widget _widgetForRoute(String route) { 25 26 27 switch (route) { 28 29 30 case 'route': 31 return MaterialApp( 32 home: Scaffold( 33 appBar: AppBar( 34 title: Text('Flutter页面'), 35 ), 36 body: Center( 37 child: Text('行走的猪蹄', 38 style: TextStyle(color: Colors.red), 39 textDirection: TextDirection.ltr), 40 ), 41 ), 42 ); 43 default: 44 return Center( 45 child: Text('Unknown route: $route', 46 style: TextStyle(color: Colors.red), 47 textDirection: TextDirection.ltr), 48 ); 49 } 50}