:一:Flutter
和原生之間
進(jìn)行通信可以通過以下幾種方式:
- 1埂奈,
Flutter MethodChannel
:Flutter提供了MethodChannel來實(shí)現(xiàn)Flutter與原生平臺(tái)的雙向方法調(diào)用报腔。我們可以在Flutter中創(chuàng)建一個(gè)MethodChannel對(duì)象生蚁,并定義方法的名稱和參數(shù)。然后在原生代碼中注冊(cè)相應(yīng)的方法處理程序胆剧,當(dāng)Flutter調(diào)用該方法時(shí)驼仪,原生代碼會(huì)執(zhí)行相應(yīng)的操作觅闽,并返回結(jié)果給Flutter艘儒。
- 2聋伦,
Flutter EventChannel
:EventChannel用于在Flutter和原生之間傳遞事件流。我們可以在Flutter中創(chuàng)建一個(gè)EventChannel對(duì)象界睁,并定義事件的名稱和參數(shù)觉增。然后在原生代碼中監(jiān)聽該事件,并在特定條件下發(fā)送事件給Flutter翻斟。
- 3逾礁,
PlatformView
:如果你需要在Flutter中使用原生控件或視圖,可以使用PlatformView访惜。它允許我們?cè)贔lutter中嵌入原生視圖嘹履,并與其進(jìn)行交互。
- 4债热,
Flutter Plugin
:如果需要更復(fù)雜的功能或者想要封裝一些原生功能為Flutter插件砾嫉,可以創(chuàng)建一個(gè)Flutter插件。Flutter插件允許我們?cè)贔lutter和原生之間建立更高級(jí)的通信機(jī)制窒篱,并提供一致的API給Flutter開發(fā)者使用焕刮。
- 5,
FlutterBoost
是基于Flutter
的Boost庫
墙杯,其實(shí)現(xiàn)原理主要包括以下幾個(gè)方面:
FlutterBoost
說明:
- 引擎復(fù)用:FlutterBoost通過復(fù)用單個(gè)Flutter引擎實(shí)例配并,使得在原生和Flutter之間切換頁面時(shí),不需要每次都創(chuàng)建新的引擎實(shí)例高镐。這大大提高了頁面切換的流暢性和性能溉旋。
- 頁面棧管理:FlutterBoost內(nèi)部維護(hù)了一個(gè)頁面棧,用于管理所有的Flutter頁面和原生頁面嫉髓。當(dāng)進(jìn)行頁面跳轉(zhuǎn)時(shí)观腊,它會(huì)根據(jù)頁面棧的狀態(tài)來決定是顯示Flutter頁面還是原生頁面。
- 生命周期同步:FlutterBoost會(huì)監(jiān)聽原生頁面的生命周期事件算行,并將這些事件同步到對(duì)應(yīng)的Flutter頁面上恕沫。這樣,即使是在原生頁面和Flutter頁面之間切換纱意,F(xiàn)lutter頁面也能正確地響應(yīng)各種生命周期事件婶溯。
- 消息通道:FlutterBoost使用了Flutter的平臺(tái)通道(Platform Channels)機(jī)制,以實(shí)現(xiàn)原生和Flutter之間的數(shù)據(jù)通信偷霉。這使得在原生和Flutter頁面之間傳遞參數(shù)迄委、共享數(shù)據(jù)變得可能。
- 路由管理:FlutterBoost還提供了一套統(tǒng)一的路由管理機(jī)制类少,開發(fā)者只需要簡(jiǎn)單地注冊(cè)路由叙身,就可以方便地在原生和Flutter頁面之間進(jìn)行跳轉(zhuǎn)。
FlutterBoost
的實(shí)現(xiàn)原理比較復(fù)雜硫狞,涉及到很多Flutter
的底層機(jī)制信轿。上面只是對(duì)其實(shí)現(xiàn)原理的一個(gè)簡(jiǎn)單概述晃痴,如果想要深入了解,建議查閱其源代碼和相關(guān)文檔财忽。接下來主要講FlutterBoost
倘核。
二:FlutterBoost
的具體使用:
https://github.com/alibaba/flutter_boost
FlutterBoost
的版本
For Flutter SDK 3.0 and above, use 4.0.1+.
For Flutter SDK below 3.0, use v3.0-release.2 or earlier versions.
The null safety versions supporting Flutter SDK 2.5.x are 3.1.0+.
The versions supporting Flutter SDK 3.16.x are 5.0.0+.
The versions supporting HarmonyOS are [4.5.0, 5.0.0).
1,flutter
工程項(xiàng)目里面即彪,集成和使用flutter_boost
紧唱。
①flutter
工程項(xiàng)目里面,pubspec.yaml
配置依賴庫隶校。
修改配置:
注意: 這里一定要對(duì) environment
進(jìn)行修改. 不然會(huì)因?yàn)?code>null safety的問題報(bào)錯(cuò)漏益。
flutter_boost:
git:
url: 'https://github.com/alibaba/flutter_boost.git'
ref: '4.5.11'
修改之后 ,執(zhí)行
flutter pub get
// 報(bào)錯(cuò)的話,也可以執(zhí)行下這個(gè)
flutter pub upgrade
沒什么問題報(bào)錯(cuò)深胳,就是集成成功了绰疤。
②flutter
工程項(xiàng)目里面,配置使用flutter_boost
舞终。
修改main.dart
文件峦睡,配置頁面路由
import 'package:flutter/material.dart';
import 'package:flutter_project/widget/HomeScreen.dart';
import 'package:flutter_project/widget/Routes.dart';
// 看下面 1,2权埠,3 地方就行了
// 看下面 1榨了,2,3 地方就行了
// 看下面 1攘蔽,2龙屉,3 地方就行了
// 看下面 1,2满俗,3 地方就行了
// 0 導(dǎo)入 flutter_boost
import 'package:flutter_boost/flutter_boost.dart';
void main() {
// 2, 這里初始化新增的CustomFlutterBinding類
CustomFlutterBinding();
runApp(const MyApp());
}
// 1, 新增CustomFlutterBinding類
class CustomFlutterBinding extends WidgetsFlutterBinding
with BoostFlutterBinding {}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
onGenerateRoute: onGenerateRoute);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
// 3转捕,配置路由
////////////////////////////////////////////////////////////////////////////////
// HomeScreen 就是flutter的自定義的某個(gè)控制器頁面
static Map<String, FlutterBoostRouteFactory> routerMap = {
'flutterPage_HomeScreen': (settings, uniqueId) {
return PageRouteBuilder<dynamic>(
settings: settings,
pageBuilder: (_, __, ___) => const HomeScreen(
title: "我是flutter頁",
parms: {"age": "18", "sex": "女", "adress": "湖北省麻城市金橋大廈尚苑小區(qū)53棟301"},
),
);
}
};
Route<dynamic>? routeFactory(RouteSettings settings, String? uniqueId) {
FlutterBoostRouteFactory? func = routerMap[settings.name!];
if (func == null) {
return null;
}
return func(settings, uniqueId);
}
////////////////////////////////////////////////////////////////////////////////
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
child: Text('push新頁面 路由帶參數(shù)'),
onPressed: () {
Navigator.pushNamed(context, "/homeScreen");
},
),
],
),
),
);
}
}
③配置完成,需要執(zhí)行
flutter run
運(yùn)行一邊flutter
工程唆垃,使其生成對(duì)應(yīng)的各端代碼五芝,同時(shí)也檢查是否有報(bào)錯(cuò)。
2辕万,原生工程里面枢步,集成和使用flutter_boost
。
①至于podfile
里面的配置渐尿,這里不多說了醉途,其實(shí)不需要配置和之前,pod
集成flutter
一模一樣砖茸,不需要做修改隘擎。
#pragma mark -- flutter配置1
# platform :ios, '9.0'
platform :ios, '12.0'
# flutter_application_path 是flutter 工程的項(xiàng)目路徑
flutter_application_path = '../flutter_project'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
post_install do |installer|
flutter_post_install(installer) if defined?(flutter_post_install)
end
target 'iOSProject' do
#pragma mark -- flutter配置2
use_frameworks!
# 這邊引入
install_all_flutter_pods(flutter_application_path)
pod 'MBProgressHUD', '~> 0.9.1'
pod 'Masonry', '~> 1.1.0'
end
執(zhí)行
pod install
podhelper.rb
腳本會(huì)自動(dòng)把你的plugins
,Flutter.framework
凉夯,和 App.framework
集成到你的項(xiàng)目中货葬。
②添加flutter_boost
的Delegate
定義一個(gè)FlutterDelegate