日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Flutter混合开发:Android中如何启动Flutter

發(fā)布時間:2024/4/15 Android 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flutter混合开发:Android中如何启动Flutter 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

現(xiàn)有項目中引入Flutter

啟動flutter頁面

加速啟動

啟動傳參


?

flutter可以獨立完成項目,但是在現(xiàn)有項目情況下最好的方式就是混合開發(fā),逐步過渡。這樣就會共存native和flutter代碼,而其中最關(guān)鍵的就是native如何啟動flutter頁面,及flutter與native如何交互。

本文以Android為例,展示如何在一個現(xiàn)有項目中引入flutter、啟動flutter,如何加速啟動以及如何傳參。

現(xiàn)有項目中引入Flutter

在現(xiàn)有的Android項目中,新建一個flutter module。創(chuàng)建完module后會發(fā)現(xiàn)自動在主module中依賴了。當(dāng)然我們?nèi)绻渌椖渴褂迷揻lutter模塊,并不會自動進行這一步,所以要先在setting.gradle中注冊,如下:

setBinding(new Binding([gradle: this])) evaluate(new File(settingsDir,'flutter_module/.android/include_flutter.groovy' ))include ':flutter_module'

然后在主module中依賴:

implementation project(path: ':flutter')

這樣就可以進行混合開發(fā)了。

啟動flutter頁面

新建flutter module后會自動創(chuàng)建一個main頁面,那么native如何打開這個頁面?

首先在主module的manifest中添加:

<activityandroid:name="io.flutter.embedding.android.FlutterActivity"android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"android:hardwareAccelerated="true"android:windowSoftInputMode="adjustResize"/>

然后用一下代碼即可打開flutter主頁面

startActivity(FlutterActivity.createDefaultIntent(this))

那么如何打開其他頁面?

比如我們創(chuàng)建一個新的flutter頁面second:

import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart';class SecondPage extends StatefulWidget{@overrideState<StatefulWidget> createState() {return _SecondPage();}}class _SecondPage extends State<SecondPage>{@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("test"),),body:Text("test"));} }

然后在main.dart的App下注冊這個頁面:

class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(primarySwatch: Colors.blue,),home: MyHomePage(title: 'Flutter Demo Home Page'),routes: {"second" : (BuildContext context) => SecondPage(), //也可以用其他方式注冊},);} }

這樣在flutter中可以用以下代碼打開這個頁面:

Navigator.of(context).pushNamed("second");

而在Android中就可以用以下代碼即可打開該頁面:

startActivity(FlutterActivity.withNewEngine().initialRoute("second").build(this))

加速啟動

通過上面代碼打開flutter頁面時會出現(xiàn)黑屏現(xiàn)象,時間并不短,很影響體驗。因為每次都重新new一個flutter engine( createDefaultIntent函數(shù)內(nèi)部其實也是withNewEngine().build(launchContext) )。

官方給出的解決方案是使用engine cache,比如在Appliation中添加cache:

var flutterEngine = FlutterEngine(this)flutterEngine.dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault())FlutterEngineCache.getInstance().put("main", flutterEngine)

然后將啟動改成:

startActivity(FlutterActivity.withCachedEngine("main").build(this))

但是上面僅僅是啟動main頁面,如果想啟動其他頁面,比如second,就需要繼續(xù)添加cache:

var flutterEngine2 = FlutterEngine(this)flutterEngine2.navigationChannel.setInitialRoute("second")flutterEngine2.dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault())FlutterEngineCache.getInstance().put("second", flutterEngine2)

注意這里通過setInitialRoute設(shè)置了route。然后啟動即可:

startActivity(FlutterActivity.withCachedEngine("second").build(this))

通過緩存engine,啟動時黑屏?xí)r間縮短了很多,幾乎不可察覺(注意第一次可能還會稍微黑屏一下)。

啟動傳參

上面我們打開main和second頁面沒有傳參,那么如果想傳入一些初始化必要的參數(shù),如何處理?

目前flutter框架并沒有封裝攜帶參數(shù)的api,也就是說native跳轉(zhuǎn)flutter官方是沒有參數(shù)。但是我們實際場景又有這樣的需求,怎么處理?

官方?jīng)]有給出相應(yīng)的api,那么只能從route上想辦法。首先改變app中注冊route的方式,上面直接使用routes這種map的形式,我們換成onGenerateRoute這種RouteFactory形式,如下:

onGenerateRoute: (RouteSettings settings) {if(settings.name.startsWith("second")){return MaterialPageRoute(builder: (BuildContext context) {return SecondPage(settings.name);});}else {return MaterialPageRoute(builder: (BuildContext context) {return Scaffold(body: Center(child: Text("page not found"),),);});}},

這里的settings.name就是route,因為我們想在route后面添加參數(shù),所以通過開頭來判斷是那個頁面。

注意:示例中直接將route url傳給頁面,其實應(yīng)該在這里統(tǒng)一解析出來,以map的形式傳給頁面。

然后修改Second頁面:

class SecondPage extends StatefulWidget{String url;SecondPage(String url){this.url = url;}@overrideState<StatefulWidget> createState() {return _SecondPage();}}class _SecondPage extends State<SecondPage>{@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("test"),),body:Text("test:${widget.url}"));} }

這里沒有解析,直接將url展示出來了,目的是參數(shù)傳到位即可。

最后在native使用如下代碼:

startActivity(FlutterActivity.withNewEngine().initialRoute("second?text=second test").build(this))

就可以傳遞參數(shù)了。

但是這樣就引出了另外一個問題,因為上面這種啟動方式并沒有使用engine cache,如果使用engine cache那么route就必須提前定好以便在Appllication中放入cache中。但是我們既然要傳參,那么說明route是動態(tài)改變的,所以這兩個是沖突的,這樣在傳參的情況下就無法加速啟動了么?

?

總結(jié)

以上是生活随笔為你收集整理的Flutter混合开发:Android中如何启动Flutter的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。