flutter_boost Android集成与使用

栏目: C++ · 发布时间: 5年前

内容简介:版权声明:本文为博主原创文章,允许转载,但请保留出处。 https://blog.csdn.net/ddwhan0123/article/details/89675963

版权声明:本文为博主原创文章,允许转载,但请保留出处。 https://blog.csdn.net/ddwhan0123/article/details/89675963

转载请注明出处王亟亟的大牛之路

之前用 fluro 替代Flutter自带的Navigation实现一些路由操作,但是Native页面和Flutter页面的一些交互并没有完成,昨天花了些时间集成了安卓模块的 flutter_boost ,这边把碰到的问题和一些经历整合一下分享给大家,方便大家快速集成。

项目相关

项目地址: https://github.com/alibaba/flutter_boost

博客地址: 闲鱼技术

因为闲鱼团队这边已经做实现方法和思路的一些分析,所以本文就不会再去抄读一遍,建议大家自行阅读。

编写Flutter Widget的容器Activity

Flutter相关的集成操作在原项目的readme中已经详细列出了,我这里只针对Native部分做一些介绍

//主业务页面需要继承BoostFlutterActivity才能使用其中的代理类FlutterContent
public class MainActivity extends BoostFlutterActivity {
}

如果你有自己的封装类建议可以先继承 BoostFlutterActivity 再自行实现,集成链路举例如下

MainActivity–>MyBoostFlutterActivity–>FlutterActivity–>Activity

继承这个类之后必须实现

//用于实现Flutter实现,新创建的Flutter项目的onCreate方法里也会有 GeneratedPluginRegistrant.registerWith(this);方法

void onRegisterPlugins(PluginRegistry registry);

//对应Flutter部分组建名(这个名字需要静态注册)
@Override
public abstract String getContainerName();

//Native和Flutter互相传参时可以在这里返回一个任意类型的map,Flutter端对应的是Map<dynamic, dynamic> params类型的对象
@Override
public abstract Map getContainerParams();

Native业务开这个Activity和打开其他Activity一样只需要用Intent开就行,如果要传参数就.putExtra()传就行。用 ARouter 或者 DeepLink 实现跳转的使用体验会更好,这个在Flutter跳转Native时再提。

实现这三个方法,我们的容器Activity就完成了。

App自定义的Application对象

所有的消息都会在Application里通过IPlatform借口做分发,所以我们需要在application里进行一些初始化和页面跳转分发的逻辑

public class MyApplication extends FlutterApplication {
    @Override
    public void onCreate() {
        super.onCreate();

        //初始化Flutter插件并实现回调
        FlutterBoostPlugin.init(new IPlatform() {
            @Override
            public Application getApplication() {
                return MyApplication.this;
            }

            /**
             * 获取应用入口的Activity,这个Activity在应用交互期间应该是一直在栈底的
             * @return
             */
            @Override
            public Activity getMainActivity() {
                return MainActivity.sRef.get();
            }

            @Override
            public boolean isDebug() {
                return true;
            }

            /**
             * 如果flutter想打开一个本地页面,将会回调这个方法,页面参数将会拼接在url中
             *
             * 例如:sample://nativePage?aaa=bbb
             *
             * 参数就是类似 aaa=bbb 这样的键值对
             *
             * @param context
             * @param url
             * @param requestCode
             * @return
             */
            @Override
            public boolean startActivity(Context context, String url, int requestCode) {
                Log.d("---> MyApplication","startActivity url "+url);
                return PageRouter.openPageByUrl(context,url,requestCode);
            }

            @Override
            public Map getSettings() {
                return null;
            }
        });
    }
}

继承FlutterApplication的主要目的是在onCreate里调用 FlutterMain.startInitialization(this);

所以你也可以自己实现该方法,那就爱继承谁都行了。

Flutter端配置

@override
  void initState() {
    super.initState();
    //初始化Flutter页面自身的一些路由,我的sample里使用的是fluro
    final router = new Router();
    Routes.configureRoutes(router);
    Application.router = router;

	//注册Native返回的key与Flutter页面的对应Map
    FlutterBoost.singleton.registerPageBuilders({
      ///可以在native层通过 getContainerParams 来传递参数
      'homePage': (pageName, params, _) => renderHome(pageName, params, _),
    });
	
	//取最上面的一个页面为首屏页面,而不是 Widget build(BuildContext context) {}内所返回的Widget
    FlutterBoost.handleOnStartPage();
  }

入口页完整代码

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    final router = new Router();
    Routes.configureRoutes(router);
    Application.router = router;

    FlutterBoost.singleton.registerPageBuilders({
      ///可以在native层通过 getContainerParams 来传递参数
      'homePage': (pageName, params, _) => renderHome(pageName, params, _),
    });

    FlutterBoost.handleOnStartPage();
  }

  Widget renderHome(String pageName, Map<dynamic, dynamic> params, String _) {
    print("---> pageName " + pageName);
    return HomePage();
  }

  @override
  Widget build(BuildContext context) {
    final app = MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primaryColor: Colors.white,
      ),
      builder: FlutterBoost.init(postPush: _onRoutePushed),
      home: Container(),
      onGenerateRoute: Application.router.generator,
    );

    return app;
  }

  void _onRoutePushed(
      String pageName, String uniqueId, Map params, Route route, Future _) {
    print('---> _onRoutePushed pageName ' + pageName);
  }
}

各种跳转的姿势

1.Native跳Flutter

触发跳转的地方

Intent intent=new Intent(context, MainActivity.class);
                intent.putExtra("key","你要传的参数");
                context.startActivity(intent);

Flutter容器内

@Override
    public Map getContainerParams() {
        //params of the page
        Map<String,String> params = new HashMap<>();
        params.put("key",getIntent().getStringExtra("key"));
        return params;
    }

Flutter main.dart

//homePage是你关联的Key名字getContainerParams()给的map会在params里
'homePage': (pageName, params, _) => renderHome(pageName, params, _),

运行效果

flutter_boost Android集成与使用

2.Flutter页面开Native页面

FlutterBoost.singleton.openPage("原生页面的key", {
      "query": {"key": "value"}//你的业务数据,不需要的话传{}
    });

效果如下

flutter_boost Android集成与使用

Flutter跳Flutter直接就用Navigation跳就完了。

运转流程

Native跳转Flutter的跳转过程:

Native页面—>Flutter容器—>容器装载Flutter插件–>Flutter根据对应关系选择对应的Flutter Widget

Flutter跳转Native的跳转过程

openPage方法发送消息–>IPlatform的startActivity方法接收到拼接成数据串的url—>经过逻辑处理打开对应的Native页面

为什么之前说用路由库或者DeepLink会更好做是因为,处理完Native收到的url可以直接拼接成deepLink或者路由库的路由串 如 nio://nativePage/order?aaa=bbb

不会配DeepLink的可以看这个

常用的一些方法

closeCurPage(Map params) //关闭当前页面

addBoostContainerLifeCycleObserver(
          BoostContainerLifeCycleObserver observer)//添加生命周期监听
    
addBoostNavigatorObserver(BoostNavigatorObserver observer)//添加路由变化监听

addContainerObserver(BoostContainerObserver observer)//添加内容变化监听

closePageForContext(BuildContext context)//关闭容器

closePage(String url, String pageId, Map params,
      {bool animated})//关闭指定页面

sample源码地址: https://github.com/ddwhan0123/flutter_tutorial/tree/boost_branch

因为不会iOS所以只集成了Android部分的实现,谢谢各位观众老爷

flutter_boost Android集成与使用

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

失控

失控

[美] 凯文·凯利 / 东西文库 / 新星出版社 / 2011-3 / 98.00元

2006年,《长尾理论》的作者克里斯·安德森在亚马逊网站上这样评价该书: “这可能是90年代最重要的一本书”,并且是“少有的一年比一年卖得好的书”。“尽管书中的一些例子在十几年后可能有些过时,但(它们所表达的)信息却越来越成为真知灼见”。“在那时人们还无法想象博客和维基等大众智慧的突起,但凯利却分毫不差地预见到了。这可能是过去十年来最聪明的一本书。” 这是《黑客帝国》主要演员的必读物之......一起来看看 《失控》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具