由于官方flutter工程對(duì)原生項(xiàng)目侵入性極大
不適合于大型項(xiàng)目開(kāi)發(fā)
顧本人使用了flutter module 和 flutterboost
完美解決的flutter和native的交互
FlutterBoost是有阿里閑魚(yú)團(tuán)隊(duì)開(kāi)發(fā)的一款flutter插件
新一代Flutter-Native混合解決方案亡电。 FlutterBoost是一個(gè)Flutter插件车胡,它可以輕松地為現(xiàn)有原生應(yīng)用程序提供Flutter混合集成方案菠净。FlutterBoost的理念是將Flutter像Webview那樣來(lái)使用步清。在現(xiàn)有應(yīng)用程序中同時(shí)管理Native頁(yè)面和Flutter頁(yè)面并非易事哑芹。 FlutterBoost幫你處理頁(yè)面的映射和跳轉(zhuǎn)堵幽,你只需關(guān)心頁(yè)面的名字和參數(shù)即可(通常可以是URL)瞳腌。
github地址:
傳送門(mén)https://github.com/alibaba/flutter_boost
-
flutter跳轉(zhuǎn)ios頁(yè)面自定義配置
根據(jù)官方在flutter里配置路由的方式,我在ios寫(xiě)了一套配置controller的方案
swift:
var boostflag = "_ios_"
@objc
class BoostControllerConfig : NSObject {
@objc
static var controllers : [String : BoostModel] {
return [ boostflag + "main" : BoostModel({_,_,_ in MainViewController()}),
///這里從flutter端發(fā)過(guò)來(lái)的參數(shù)都會(huì)在BoostModel的block里回調(diào)镜雨,這里需要返回給總
///路由一個(gè)controller
boostflag + "Second" : BoostModel({ (_, param, _) -> UIViewController in
return SecondViewController(param , true)
}),
boostflag + "map" : BoostModel({_,_,_ in MapViewController()})]
}
}
@objc
class BoostModel : NSObject {
@objc
var BoostBlockSwift : ((String , [String: Any] ,[String : Any]) -> UIViewController)?
///使用block回調(diào)參數(shù)
init(_ block : @escaping ((String , [String: Any] ,[String : Any]) -> UIViewController)) {
super.init()
self.BoostBlockSwift = {(name , param , exits) in
return block(name , param , exits)
}
}
}
-
跳轉(zhuǎn)的所有由路請(qǐng)求由ios管理
這里官方在demo里已經(jīng)寫(xiě)好嫂侍,我在基礎(chǔ)上稍微修改了一下
這里是回調(diào)上面的配置
oc: PlatformRouterImp.m
- (void)open:(NSString *)name
urlParams:(NSDictionary *)params
exts:(NSDictionary *)exts
completion:(void (^)(BOOL))completion
{
///如果flutter請(qǐng)求的name帶有ios標(biāo)識(shí)
if ([name containsString:@"_ios_"]) {
///從配置中取出名字對(duì)應(yīng)的model
BoostModel * model = BoostControllerConfig.controllers[name];
//把從flutter端傳過(guò)來(lái)的參數(shù)回調(diào)
UIViewController * vc = model.BoostBlockSwift(name, params, exts);
vc.title = exts[@"title"];
[self.navigationController pushViewController:vc animated:true];
} else {
FLBFlutterViewContainer *vc = FLBFlutterViewContainer.new;
vc.title = exts[@"title"];
[vc setName:name params:params];
[self.navigationController pushViewController:vc animated:true];
}
if(completion) completion(YES);
}
-
flutter端push native頁(yè)面
dart:
FlutterBoost.singleton.open("_ios_map");
demo已經(jīng)上傳GitHub
使用的fluttermodule方式
侵入性很小
demo很詳細(xì)
喜歡的請(qǐng)點(diǎn)star
傳送門(mén)
https://github.com/xujiyao123/FlutterNativeHybrid