Flutter笔记 02:iOS调用多个flutter界面

简介: Flutter笔记 02:iOS调用多个flutter界面

需求


flutter需要调用多个Flutter界面,且需要传输数据到flutter


问题


由于最开始的与iOS的混编,是只调用一个界面,而现在需要调用多个。所以这里我们是通过FlutterEngine初始化FlutterViewController,并通过设置setInitialRoute设置初始化路由,以下是交互的代码

<!--OC代码-->
//通过engine创建flutter界面
FlutterEngine flutterEngine = [[FlutterEngine alloc] initWithName:@"flutter engine"];
[flutterEngine run];
FlutterViewController *flutterVC = [[FlutterViewController alloc] initWithEngine:flutterEngine nibName:nil bundle:nil];
//设置路由
[flutterVC setInitialRoute:@"message"];
//消息传递通道,native传递到flutter
FlutterMethodChannel *flutterChannel = [FlutterMethodChannel methodChannelWithName:@"nativeToFluuter" binaryMessenger:flutterVC.binaryMessenger];
[flutterChannel invokeMethod:@"message" arguments:@{@"message":@"hello world"}];
[self.navigationController pushViewController:flutterVC animated:YES];
<!--Flutter代码-->
void main() => runApp(_widgetForRoute(ui.window.defaultRouteName));
Widget _widgetForRoute(String route){
  switch (route){
    case 'message':
      return MyApp();
    case 'other':
      return OtherPage();
    default:
      return DefaultPage();
  }
}

但是通过实测发现,setInitialRoute设置的路由并不生效,在flutter端通过 window.defaultRouteName拿到的route永远是/根符号。这个是Flutter SDK的一个bug


解决办法有以下几种


方式1 -


如果必须使用setInitialRoute来区分不同的flutter界面,那么就不能通过FlutterEngine初始化FlutterViewController,需要直接使用 alloc+init 或者 new 的方式初始化FlutterViewController


注:这种方式有一个问题,每次渲染会有启动页一闪而过的效果,且这种方式初始化的FlutterViewController在关闭时是无法释放内存


改进后的代码如下所示

<!--OC代码-->
//通过alloc+init创建flutter界面
FlutterViewController *flutterVC = [[FlutterViewController alloc] init];
//设置路由
[flutterVC setInitialRoute:@"message"];
//消息传递通道,native传递到flutter
FlutterMethodChannel *flutterChannel = [FlutterMethodChannel methodChannelWithName:@"nativeToFluuter" binaryMessenger:flutterVC.binaryMessenger];
[flutterChannel invokeMethod:@"message" arguments:@{@"message":@"hello world"}];
[self.navigationController pushViewController:flutterVC animated:YES];
<!--Flutter代码-->
void main() => runApp(_widgetForRoute(ui.window.defaultRouteName));
Widget _widgetForRoute(String route){
  switch (route){
    case 'message':
      return MyApp();
    case 'other':
      return OtherPage();
    default:
      return DefaultPage();
  }
}


方式2


通过FlutterMethodChannel传入的method进行区分,以下是代码逻辑

<!--OC代码-->
//通过alloc+init创建flutter界面
FlutterViewController *flutterVC = [[FlutterViewController alloc] init];
//消息传递通道,native传递到flutter
FlutterMethodChannel *flutterChannel = [FlutterMethodChannel methodChannelWithName:@"nativeToFluuter" binaryMessenger:flutterVC.binaryMessenger];
[flutterChannel invokeMethod:@"message" arguments:@{@"message":@"hello world"}];
[self.navigationController pushViewController:flutterVC animated:YES];
<!--Flutter代码-->
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
  //用于区分不同界面
  String pageRoute;
  dynamic arguments;
  @override
  void initState() {
    super.initState();
ConstantsUtil.nativeToFlutterChannel.setMethodCallHandler((call) {
      setState(() {
        pageRoute = call.method;
        arguments = call.arguments;
      });
      return null;
    });
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: rootPage(pageRoute),
    );
  }
  rootPage(String route){
    switch (route){
      case 'message':
        return MessagePage(title: 'Message', arguments: arguments,);
      case 'other':
        return OtherPage(title: 'Other', arguments: arguments,);
      default:
        return DefaultPage();
    }
  }
}


相关文章
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
73 7
|
3月前
|
Dart
Flutter笔记:手动配置VSCode中Dart代码自动格式化
Flutter笔记:手动配置VSCode中Dart代码自动格式化
429 5
|
3月前
|
XML 安全 Android开发
Flutter配置Android和IOS允许http访问
Flutter配置Android和IOS允许http访问
106 3
|
3月前
|
存储 开发者 UED
Flutter笔记:谈Material状态属性-为什么FlatButton等旧版按钮就废弃了
Flutter笔记:谈Material状态属性-为什么FlatButton等旧版按钮就废弃了
60 4
|
3月前
|
开发工具 iOS开发
解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app
解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app
135 2
|
3月前
|
开发者 Windows
Flutter笔记:Widgets Easier组件库(9)使用弹窗
Flutter笔记:Widgets Easier组件库(9)使用弹窗
104 3
|
3月前
|
iOS开发
解决Flutter运行IOS报错:Podfile is out of date
解决Flutter运行IOS报错:Podfile is out of date
71 1
|
3月前
|
数据安全/隐私保护 Android开发 开发者
Flutter笔记:Widgets Easier组件库-使用隐私守卫
Flutter笔记:Widgets Easier组件库-使用隐私守卫
50 2
|
3月前
|
UED 开发者
Flutter笔记:Widgets Easier组件库(13)- 使用底部弹窗
Flutter笔记:Widgets Easier组件库(13)- 使用底部弹窗
59 2
|
3月前
|
开发者
Flutter笔记:Widgets Easier组件库(5)使用加减器
Flutter笔记:Widgets Easier组件库(5)使用加减器
77 2