void main() => runApp(_widgetForRoute(window.defaultRouteName));
Widget _widgetForRoute(String route) {
switch (route) {
case 'yc_route':
return MyHomePage(title: '匹配到了,这个是flutter页面');
}
}
```
//flutterEngine.getNavigationChannel().setInitialRoute("yc");
// 关键代码,将Flutter页面显示到FlutterView中
// 这个方法的作用就是将Flutter编写的UI页面显示到FlutterView中
// flutterEngine的类型为FlutterEngine,字面意思就是Flutter引擎
// 它负责在Android端执行Dart代码,将Flutter编写的UI显示到FlutterView/FlutterActivity/FlutterFragment中。
flutterView.attachToFlutterEngine(flutterEngine);
// FlutterEngine加载的路由名称为"/",我们可以通过下面的代码指定初始路由名称
// 传参的情况没有变化,直接在路由名称后面拼接参数就可以
// todo 放在这里不生效,思考为什么
// flutterEngine.getNavigationChannel().setInitialRoute("yc");
}
```
void main() => runApp(_widgetForRoute(window.defaultRouteName));
Widget _widgetForRoute(String route) {
switch (route) {
case 'yc_route':
return MyHomePage(title: '匹配到了,这个是flutter页面');
}
}
```
// 通过FlutterFragment.withNewEngine()获取到NewEngineFragmentBuilder对象
FlutterFragment.NewEngineFragmentBuilder fragmentBuilder = FlutterFragment.withNewEngine();
// 使用建造者模式构造出FlutterFragment对象,可以通过initialRoute()方法指定初始路由名称。
// 传递参数只需要在路由名称后面进行拼接。
FlutterFragment.NewEngineFragmentBuilder initialRoute = fragmentBuilder.initialRoute("yc");
FlutterFragment flutterFragment = initialRoute.build();
getSupportFragmentManager()
.beginTransaction()
.add(R.id.rl_flutter, flutterFragment)
.commit();
// 存在的问题
// 使用的withNewEngine()方法从名称上也能看出每次都是创建一个新的FlutterEngine对象来显示Flutter UI,
// 但是从官方文档中我们可以了解到每个FlutterEngine对象在显示出Flutter UI之前
// 是需要一个warm-up(不知道能不能翻译为预热)期的,这会导致屏幕呈现短暂的空白,
// 解决方式就是预先创建并启动FlutterEngine,完成warm-up过程,然后将这个FlutterEngine缓存起来,
// 之后使用这个FlutterEngine来显示出Flutter UI。
// 解决方案看:FlutterFragmentCachedActivity
// 如何获取到FlutterEngine对象呢?FlutterFragment中定义了一个getFlutterEngine()方法,
// 从方法名来看大概就是获取FlutterEngine对象。
// 尝试过创建MethodChannel时传入flutterFragment.getFlutterEngine().getDartExecutor(),
// 运行后会直接抛出空指针异常,异常产生的位置在FlutterFragment的getFlutterEngine()方法中
// 错误原因是这里的delegate为null,全局搜索一下,发现在FlutterFragment的onAttach()方法中会对delegate赋值,也就是说明此时没有执行onAttach()方法。
// 猜测这就是由于上面提到过的FlutterEngine的warm-up机制,这是一个耗时过程,
// 因此FlutterFragment并不会立刻执行onAttach()方法,导致我们在Activity的onCreate()方法中直接使用FlutterFragment的getFlutterEngine()方法会抛出异常。
// todo 调用下面这句话会空指针崩溃
// FlutterEngine flutterEngine = flutterFragment.getFlutterEngine();
}
```
// 方式二、FlutterActivity显示的路由名称可设置,每次都创建一个新的FlutterEngine对象
startActivity(
FlutterActivity
.withNewEngine()
.initialRoute("yc")
.build(this)
);
// 方式三、FlutterActivity显示的路由名称可设置,使用缓存好的FlutterEngine对象
/*startActivity(
FlutterActivity
.withCachedEngine("my_engine_id")
.build(this)
);*/
}
```
@Override
protected void onPause() {
super.onPause();
flutterEngine.getLifecycleChannel().appIsInactive();
}
@Override
protected void onStop() {
super.onStop();
flutterEngine.getLifecycleChannel().appIsPaused();
}
```
Map<String, dynamic> parseRouter(){
String url = window.defaultRouteName;
// route名称,路由path路径名称
String route = url.indexOf('?') == -1 ? url : url.substring(0, url.indexOf('?'));
// 参数Json字符串
String paramsJson = url.indexOf('?') == -1 ? '{}' : url.substring(url.indexOf('?') + 1);
// 解析参数
Map<String, dynamic> params = json.decode(paramsJson);
params["route"] = route;
return params;
}
```
//第二种是不生效的
private void addFlutterView() {
flutterEngine = new FlutterEngine(this);
binaryMessenger = flutterEngine.getDartExecutor().getBinaryMessenger();
flutterEngine.getDartExecutor().executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
);
flutterView = new FlutterView(this);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
rlFlutter.addView(flutterView, lp);
// todo 放在这里不生效,思考为什么
flutterEngine.getNavigationChannel().setInitialRoute("yc");
flutterView.attachToFlutterEngine(flutterEngine);
// todo 放在这里不生效,思考为什么
// flutterEngine.getNavigationChannel().setInitialRoute("yc");
}
```
//源码
@Nullable
public FlutterEngine getFlutterEngine() {
return delegate.getFlutterEngine();
}
```
this.flutterView.addOnFirstFrameRenderedListener(this.flutterUiDisplayListener);
//创建一个闪屏view - FlutterSplashView
this.flutterSplashView = new FlutterSplashView(this.host.getContext());
if (VERSION.SDK_INT >= 17) {
this.flutterSplashView.setId(View.generateViewId());
} else {
this.flutterSplashView.setId(486947586);
}
//显示闪屏页
this.flutterSplashView.displayFlutterViewWithSplash(this.flutterView, this.host.provideSplashScreen());
Log.v("FlutterActivityAndFragmentDelegate", "Attaching FlutterEngine to FlutterView.");
//所创建surface 绑定到engine上
this.flutterView.attachToFlutterEngine(this.flutterEngine);
return this.flutterSplashView;
}
```
public class FlutterSplashView implements SplashScreen {
@Nullable
@Override
public View createSplashView(@NonNull Context context, @Nullable Bundle savedInstanceState) {
View v = new View(context);
v.setBackgroundColor(Color.WHITE);
return v;
}
@Override
public void transitionToFlutter(@NonNull Runnable onTransitionComplete) {
onTransitionComplete.run();
}
}
```
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。