Flutter集成插件fusion的使用

发布于 1周前 作者 sinazl 来自 Flutter

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

1 回复

更多关于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插件的更新,以确保你使用的是最新版本,并获得最新的功能和修复。

回到顶部