flutter混合開(kāi)發(fā)-1

flutter 端配置

在pubspec中添加flutter_boost

這是一個(gè)混合開(kāi)發(fā)插件

在main.dart中添加代碼

導(dǎo)入頭文件

import 'package:flutter_boost/flutter_boost.dart';

///創(chuàng)建一個(gè)自定義的Binding,繼承和with的關(guān)系如下,里面什么都不用寫(xiě)

class CustomFlutterBinding extends WidgetsFlutterBinding with BoostFlutterBinding {}

在main函數(shù)中調(diào)用CustomFlutterBinding

void main(){

? ///這里的CustomFlutterBinding調(diào)用務(wù)必不可缺少,用于控制Boost狀態(tài)的resume和pause

? CustomFlutterBinding();

return? runApp(const MyApp());

}

在第一個(gè)widget MyApp中添加路由

// 配置頁(yè)面路由

Map<String, FlutterBoostRouteFactory> routerMap = {

? ? ? ? // 這是一個(gè)map,以鍵值對(duì)配置,

? 'mainPage': (RouteSettings settings,String? uniqueId) {

? ? return CupertinoPageRoute(//// CupertinoPageRoute:類(lèi)似iOS頁(yè)面的Push效果

? ? ? ? settings: settings,

? ? ? ? builder: (_) {

? ? ? ? ? Map<String, Object> map = settings.arguments as Map<String, Object> ;

? ? ? ? ? String data = map['data'] as String;

? ? ? ? ? return MyHomePage(//自己要展示的頁(yè)面

? ? ? ? ? ? title: 'title',

? ? ? ? ? ? data: data,

? ? ? ? ? );

? ? ? ? });

? },

? 'simplePage': (settings, uniqueId) {

? ? return CupertinoPageRoute(

? ? ? ? settings: settings,

? ? ? ? builder: (_) {

? ? ? ? ? Map<String, Object> map = settings.arguments as Map<String, Object>;

? ? ? ? ? String data = map['data'] as String;

? ? ? ? ? return SimplePage(//自己要展示的頁(yè)面

? ? ? ? ? ? data: data,

? ? ? ? ? );

? ? ? ? });

? },

};

// routeFactory方法用于通過(guò)傳入的頁(yè)面名稱從routeMap獲取到對(duì)應(yīng)的路由配置方法,并傳入所需參數(shù)進(jìn)行調(diào)用

Route<dynamic>? routeFactory(RouteSettings settings, String? uniqueId) {

? FlutterBoostRouteFactory? func = routerMap[settings.name!];

? if (func == null) {

? ? return null;

? }

? return func(settings, uniqueId);

}

Widget appBuilder(Widget home) {

? return MaterialApp(

? ? home: home,

? ? debugShowCheckedModeBanner: false,

? ? /// 必須加上builder參數(shù),否則showDialog等會(huì)出問(wèn)題

? ? builder: (_, __) {

? ? ? // return const Homepage();

? ? ? return home;

? ? },

? );

}

在MyApp的build方法中,構(gòu)建FlutterBoostApp,把上邊的routeFactory和appBuilder配置到里邊

// 在重寫(xiě)的build方法中,構(gòu)建FlutterBoostApp,將routeFactory和appBuilder這兩個(gè)方法作為參數(shù)傳入。

@override

Widget build(BuildContext context) {

? return FlutterBoostApp(

? ? routeFactory,

? ? appBuilder: appBuilder,

? );

}

iOS端配置

1、

新建flutter項(xiàng)目,要和iOS項(xiàng)目在同一個(gè)目錄下

配置iOS集成環(huán)境,在Podfile中添加這三段配置信息

1、

flutter_application_path = '../你的flutter文件夾名字'

load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')

2、

? install_all_flutter_pods(flutter_application_path)

3、

post_installdo|installer|

flutter_post_install(installer)ifdefined?(flutter_post_install)

end

然后

pod install?

至此,flutter工程就與你現(xiàn)有iOS工程關(guān)聯(lián)起來(lái),修改flutter代碼并保存,即可實(shí)現(xiàn)熱重載

每次flutter 更改完代碼, iOS原生只需要pod install? 一下,就能更新到最新的修改后的flutter 代碼了

在iOS原生項(xiàng)目中,配置FlutterBoost

1: 進(jìn)行準(zhǔn)備工作創(chuàng)建?BoostDelegate單例類(lèi):

import UIKit

import flutter_boost

class BoostDelegate: NSObject, FlutterBoostDelegate {

? ? /// 單例

? ? public static let shared = BoostDelegate()?

? }

2: 實(shí)現(xiàn) FlutterBoostDelegate 委托方法

FlutterBoostDelegate委托包括三個(gè)必須實(shí)現(xiàn)的方法:

通過(guò)實(shí)現(xiàn)pushNativeRoute方法,實(shí)現(xiàn)從 Flutter 頁(yè)面跳轉(zhuǎn)到原生頁(yè)面。

通過(guò)實(shí)現(xiàn)pushFlutterRoute方法,實(shí)現(xiàn)從原生頁(yè)面跳轉(zhuǎn)到 Flutter 頁(yè)面。

通過(guò)實(shí)現(xiàn)popRoute方法,完成從Flutter頁(yè)面返回到原生頁(yè)面。

在AppDelegate中初始化FlutterBoost

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

? ? ? ? let boostDelegate = BoostDelegate.shared;

? ? ? ? FlutterBoost.instance().setup(application, delegate: boostDelegate) { engine in

? ? ? ? ? ? print("")

? ? ? ? }

? ? ? ? return true

? ? }

實(shí)現(xiàn)從iOS原生頁(yè)面跳轉(zhuǎn)到Flutter頁(yè)面

@objc func onClickNativePushFlutterButton(){

? ? ? ? // 路由參數(shù)配置

? ? ? ? let options = FlutterBoostRouteOptions()

? ? ? ? // 路由的名稱

? ? ? ? options.pageName = "homepage"

? ? ? ? // 傳遞的參數(shù)

? ? ? ? options.arguments = ["data" : textLabel.text as Any]

? ? ? ? // 頁(yè)面是否透明

? ? ? ? options.opaque = true

? ? ? ? options.completion = {completion in

? ? ? ? ? ? print("打開(kāi)Flutter頁(yè)面的操作完成")

? ? ? ? }

? ? ? ? options.onPageFinished = { dict in

? ? ? ? ? ? print("Flutter 頁(yè)面關(guān)閉返回到原生頁(yè)面時(shí),參數(shù)值:\(String(describing: dict))")

? ? ? ? }

? ? ? ? // 執(zhí)行open()會(huì)調(diào)用"BoostDelegate"中的"pushFlutterRoute"方法

? ? ? ? FlutterBoost.instance().open(options)

? ? }

實(shí)現(xiàn)從Flutter頁(yè)面跳轉(zhuǎn)到原生頁(yè)面

BoostNavigator.instance.push(

? ? ? "NewsVC",

? ? ? arguments: {"data": textStr},

);

實(shí)現(xiàn)從Flutter頁(yè)面返回到原生頁(yè)面

調(diào)用flutter_boost提供的:BoostNavigator.instance.pop()方法即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容