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()方法即可。