:一:Flutter
和原生之間
進行通信可以通過以下幾種方式:
- 1,
Flutter MethodChannel
:Flutter提供了MethodChannel來實現(xiàn)Flutter與原生平臺的雙向方法調用。我們可以在Flutter中創(chuàng)建一個MethodChannel對象,并定義方法的名稱和參數。然后在原生代碼中注冊相應的方法處理程序,當Flutter調用該方法時,原生代碼會執(zhí)行相應的操作,并返回結果給Flutter。
- 2,
Flutter EventChannel
:EventChannel用于在Flutter和原生之間傳遞事件流。我們可以在Flutter中創(chuàng)建一個EventChannel對象,并定義事件的名稱和參數。然后在原生代碼中監(jiān)聽該事件,并在特定條件下發(fā)送事件給Flutter。
- 3,
PlatformView
:如果你需要在Flutter中使用原生控件或視圖,可以使用PlatformView。它允許我們在Flutter中嵌入原生視圖,并與其進行交互。
- 4,
Flutter Plugin
:如果需要更復雜的功能或者想要封裝一些原生功能為Flutter插件,可以創(chuàng)建一個Flutter插件。Flutter插件允許我們在Flutter和原生之間建立更高級的通信機制,并提供一致的API給Flutter開發(fā)者使用。
- 5,
FlutterBoost
是基于Flutter
的Boost庫
,其實現(xiàn)原理主要包括以下幾個方面:
FlutterBoost
說明:
- 引擎復用:FlutterBoost通過復用單個Flutter引擎實例,使得在原生和Flutter之間切換頁面時,不需要每次都創(chuàng)建新的引擎實例。這大大提高了頁面切換的流暢性和性能。
- 頁面棧管理:FlutterBoost內部維護了一個頁面棧,用于管理所有的Flutter頁面和原生頁面。當進行頁面跳轉時,它會根據頁面棧的狀態(tài)來決定是顯示Flutter頁面還是原生頁面。
- 生命周期同步:FlutterBoost會監(jiān)聽原生頁面的生命周期事件,并將這些事件同步到對應的Flutter頁面上。這樣,即使是在原生頁面和Flutter頁面之間切換,F(xiàn)lutter頁面也能正確地響應各種生命周期事件。
- 消息通道:FlutterBoost使用了Flutter的平臺通道(Platform Channels)機制,以實現(xiàn)原生和Flutter之間的數據通信。這使得在原生和Flutter頁面之間傳遞參數、共享數據變得可能。
- 路由管理:FlutterBoost還提供了一套統(tǒng)一的路由管理機制,開發(fā)者只需要簡單地注冊路由,就可以方便地在原生和Flutter頁面之間進行跳轉。
FlutterBoost
的實現(xiàn)原理比較復雜,涉及到很多Flutter
的底層機制。上面只是對其實現(xià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
工程項目里面,集成和使用flutter_boost
。
①flutter
工程項目里面,pubspec.yaml
配置依賴庫。
修改配置:
注意: 這里一定要對 environment
進行修改. 不然會因為null safety
的問題報錯。
flutter_boost:
git:
url: 'https://github.com/alibaba/flutter_boost.git'
ref: '4.5.11'
image.png
修改之后 ,執(zhí)行
flutter pub get
// 報錯的話,也可以執(zhí)行下這個
flutter pub upgrade
沒什么問題報錯,就是集成成功了。
②flutter
工程項目里面,配置使用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 導入 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的自定義的某個控制器頁面
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新頁面 路由帶參數'),
onPressed: () {
Navigator.pushNamed(context, "/homeScreen");
},
),
],
),
),
);
}
}
③配置完成,需要執(zhí)行
flutter run
運行一邊flutter
工程,使其生成對應的各端代碼,同時也檢查是否有報錯。
2,原生工程里面,集成和使用flutter_boost
。
①至于podfile
里面的配置,這里不多說了,其實不需要配置和之前,pod
集成flutter
一模一樣,不需要做修改。
#pragma mark -- flutter配置1
# platform :ios, '9.0'
platform :ios, '12.0'
# flutter_application_path 是flutter 工程的項目路徑
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
腳本會自動把你的plugins
,Flutter.framework
,和 App.framework
集成到你的項目中。
②添加flutter_boost
的Delegate
定義一個FlutterDelegate
image.png