Flutter集成插件fusion的使用
Flutter集成插件fusion的使用
简介
Fusion 是新一代的混合栈管理框架,用于 Flutter 与 Native 页面统一管理,并支持页面通信、页面生命周期监听等功能。它解决了混合开发过程中普遍存在的黑屏、白屏、闪屏等问题,适合重视用户体验的App使用。
从 4.0 开始,Fusion 已完成纯鸿蒙平台(HarmonyOS Next/OpenHarmony)的适配,开发者可以在Android、iOS、HarmonyOS上得到完全一致的体验。
开始使用
0、准备
在开始前需要按照 Flutter 官方文档,将 Flutter Module 项目接入到 Android、iOS、HarmonyOS 工程中。
1、初始化
Flutter 侧
使用 FusionApp 替换之前使用的 App Widget,并传入所需路由表。
void main() {
Fusion.instance.install();
runApp(FusionApp(
routeMap: routeMap,
customRouteMap: customRouteMap,
));
}
final Map<String, FusionPageFactory> routeMap = {
'/test': (arguments) => TestPage(arguments: arguments),
kUnknownRoute: (arguments) => UnknownPage(arguments: arguments),
};
final Map<String, FusionPageCustomFactory> customRouteMap = {
'/mine': (settings) => PageRouteBuilder(
opaque: false,
settings: settings,
pageBuilder: (_, __, ___) => MinePage(
arguments: settings.arguments as Map<String, dynamic>?)),
};
Android 侧
在 Application 中进行初始化,并实现 FusionRouteDelegate 接口。
class MyApplication : Application(), FusionRouteDelegate {
override fun onCreate() {
super.onCreate()
Fusion.install(this, this)
}
override fun pushNativeRoute(name: String?, arguments: Map<String, Any>?) {
// 根据路由 name 跳转对应 Native 页面
}
override fun pushFlutterRoute(name: String?, arguments: Map<String, Any>?) {
// 根据路由 name 跳转对应 Flutter 页面
}
}
iOS 侧
在 AppDelegate 中进行初始化,并实现 FusionRouteDelegate 代理。
@UIApplicationMain
@objc class AppDelegate: UIResponder, UIApplicationDelegate, FusionRouteDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
...
Fusion.instance.install(self)
...
return true
}
func pushNativeRoute(name: String?, arguments: Dictionary<String, Any>?) {
// 根据路由 name 跳转对应 Native 页面
}
func pushFlutterRoute(name: String?, arguments: Dictionary<String, Any>?) {
// 根据路由 name 跳转对应 Flutter 页面
}
}
HarmonyOS 侧
在 UIAbility 中进行初始化,并实现 FusionRouteDelegate 代理。
export default class EntryAbility extends UIAbility implements FusionRouteDelegate {
private static TAG = 'EntryAbility'
private mainWindow: window.Window | null = null
private windowStage: window.WindowStage | null = null
override async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise<void> {
await Fusion.instance.install(this.context, this)
GeneratedPluginRegistrant.registerWith(Fusion.instance.defaultEngine!)
}
pushNativeRoute(name: string, args: Map<string, Object> | null): void {
// 根据路由 name 跳转对应 Native 页面
}
pushFlutterRoute(name: string, args: Map<string, Object> | null): void {
// 根据路由 name 跳转对应 Flutter 页面
}
}
2、Flutter 容器
普通页面模式
Android 侧
通过 FusionActivity
创建 Flutter 容器,启动容器时需要使用 Fusion 提供的 buildFusionIntent
方法。
<activity
android:name=".CustomFusionActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:exported="false"
android:hardwareAccelerated="true"
android:launchMode="standard"
android:theme="@style/FusionNormalTheme"
android:windowSoftInputMode="adjustResize" />
iOS 侧
通过 FusionViewController
创建 Flutter 容器。
// 启用原生手势
func enablePopGesture() {
navigationController?.interactivePopGestureRecognizer?.isEnabled = true
}
// 关闭原生手势
func disablePopGesture() {
navigationController?.interactivePopGestureRecognizer?.isEnabled = false
}
HarmonyOS 侧
通过 FusionEntry
创建 Flutter 容器。
const params = buildFusionParams(name, args, false, backgroundColor)
this.mainLocalStorage?.setOrCreate('params', params)
router.pushNamedRoute({name: FusionConstant.FUSION_ROUTE_NAME})
示例 Demo
以下是一个完整的示例,展示了如何在 Flutter 项目中集成 Fusion 插件。
import 'package:flutter/material.dart';
import 'package:fusion/fusion.dart';
void main() {
Fusion.instance.install();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return FusionApp(
routeMap: routeMap,
customRouteMap: customRouteMap,
);
}
}
final Map<String, FusionPageFactory> routeMap = {
'/index': (args) => IndexPage(args: args),
kUnknownRoute: (args) => UnknownPage(args: args),
};
final Map<String, FusionPageCustomFactory> customRouteMap = {
'/dialog_page': (settings) => PageRouteBuilder(
opaque: settings.opaque,
settings: settings,
pageBuilder: (_, __, ___) => DialogPage(args: settings.arguments as Map<String, dynamic>?)),
};
以上代码展示了如何在 Flutter 应用中使用 Fusion 插件来管理路由和页面导航。通过这种方式,开发者可以轻松地在 Flutter 和 Native 页面之间进行切换,并且享受到更好的性能和更低的内存占用。
更多详细信息和功能请参考 Fusion 的官方文档和示例代码。
更多关于Flutter集成插件fusion的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter集成插件fusion的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter项目中集成并使用Fusion插件,通常是为了利用阿里巴巴提供的Fusion Design组件库,以提升应用的UI体验和一致性。以下是一个基本的步骤指南,包括如何在Flutter项目中集成Fusion插件并使用其组件的示例代码。
步骤一:添加依赖
首先,在你的pubspec.yaml
文件中添加对fusion_flutter
插件的依赖。请确保你使用的是最新版本的插件。
dependencies:
flutter:
sdk: flutter
fusion_flutter: ^最新版本号 # 替换为实际最新版本号
然后运行flutter pub get
来安装依赖。
步骤二:导入Fusion组件
在你的Dart文件中导入所需的Fusion组件。例如,如果你想使用Fusion的按钮组件,可以这样导入:
import 'package:fusion_flutter/fusion_flutter.dart';
步骤三:使用Fusion组件
以下是一个简单的示例,展示如何在Flutter应用中使用Fusion的按钮组件:
import 'package:flutter/material.dart';
import 'package:fusion_flutter/fusion_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Fusion Flutter Demo'),
),
body: Center(
child: FusionButton(
type: FusionButtonType.primary,
child: Text('Click Me'),
onPressed: () {
// 按钮点击事件处理
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Button Clicked!')),
);
},
),
),
),
);
}
}
完整示例
以下是一个更完整的示例,展示了如何在Flutter应用中集成并使用Fusion的多个组件:
import 'package:flutter/material.dart';
import 'package:fusion_flutter/fusion_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Fusion Flutter Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FusionTextField(
label: 'Username',
placeholder: 'Enter your username',
),
SizedBox(height: 16),
FusionTextField(
label: 'Password',
placeholder: 'Enter your password',
obscureText: true,
),
SizedBox(height: 24),
FusionButton(
type: FusionButtonType.primary,
child: Text('Login'),
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Login Button Clicked!')),
);
},
),
SizedBox(height: 16),
FusionButton(
type: FusionButtonType.link,
child: Text('Forgot Password?'),
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Forgot Password Link Clicked!')),
);
},
),
],
),
),
),
);
}
}
总结
以上代码展示了如何在Flutter项目中集成Fusion插件,并使用其提供的组件来构建用户界面。通过引入Fusion组件库,你可以快速开发出具有一致性和高质量UI的应用。记得定期检查Fusion插件的更新,以确保你使用的是最新版本,并获得最新的功能和修复。