Flutter动态化插件Fair的使用

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

Flutter Fair 动态化插件的使用

Fair 是一个轻量级的 Flutter 包,用于动态更新 Widget。它允许开发者通过发布 UI 变更包(bundle)来实时更新应用界面,而无需等待应用的新版本发布。

快速开始

添加依赖

首先,在 pubspec.yaml 文件中添加 Fair 的依赖:

dependencies:
  fair: ^4.0.0

初始化应用

main.dart 中初始化 Fair 并将其包裹在 FairApp 组件中:

import 'package:flutter/material.dart';
import 'package:fair/fair.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  FairApp.runApplication(
    FairApp(
      child: MaterialApp(home: App())
    )
  );
}

使用动态组件

将需要动态化的组件通过 FairWidget 引入:

import 'package:fair/fair.dart';

// 在你的页面中使用 FairWidget
FairWidget(
  name: 'hello_world',
  path: 'assets/bundle/lib_hello_world.json',
)

完整示例 Demo

以下是一个完整的示例代码,展示了如何集成和使用 Fair 插件:

/*
 * Copyright (C) 2005-present, 58.com.  All rights reserved.
 * Use of this source code is governed by a BSD type license that can be
 * found in the LICENSE file.
 */

import 'dart:convert';
import 'package:fair/fair.dart';
import 'package:flutter/material.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  FairApp.runApplication(
    _getApp(),
    plugins: {
      'FairCommonPlugin': FairCommonPlugin(), // 注册自定义插件
    },
  );
}

dynamic _getParams(BuildContext context, String key) =>
    (ModalRoute.of(context)?.settings.arguments is Map)
        ? (ModalRoute.of(context)?.settings.arguments as Map)[key]
        : null;

dynamic _getData(BuildContext context, String name) {
  var data = Map.from((ModalRoute.of(context)?.settings.arguments as Map)['data']);
  data.addAll({'pageName': name});
  return data;
}

dynamic _getApp() => FairApp(
      modules: {
        'ShowFairAlertModule': () => ShowFairAlertModule(), // 注册模块
      },
      delegate: {
        'ListLoadMore': (ctx, _) => ListDelegate(), // 注册代理
      },
      child: MaterialApp(
        home: LogicHomePage(), // 主页
        routes: {
          'native_page': (context) => SampleLogicPage2Page(
              _getData(context, _getParams(context, 'name'))),
          'fair_page': (context) => FairWidget(
                  name: _getParams(context, 'name'),
                  path: _getParams(context, 'path'),
                  data: {
                    'fairProps': jsonEncode(
                        _getData(context, _getParams(context, 'name')))
                  }),
        },
      ),
    );

// 示例主页
class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Fair Demo'),
      ),
      body: Center(
        child: FairWidget(
          name: 'example_widget',
          path: 'assets/bundle/example_widget.json',
          data: {'title': 'Hello from Fair!'},
        ),
      ),
    );
  }
}

文档

更多详细信息,请参考 Fair 官方文档


通过上述步骤,您可以轻松地在 Flutter 应用中集成 Fair 插件,实现 UI 的动态更新。


更多关于Flutter动态化插件Fair的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter动态化插件Fair的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,作为IT专家,我可以为你提供一个关于如何在Flutter中使用Fair动态化插件的代码示例。Fair是一个Flutter动态化框架,允许你动态地加载和执行Dart代码,而无需重新编译和部署整个应用。

下面是一个基本的示例,展示了如何在Flutter项目中集成和使用Fair插件。

步骤1:添加Fair依赖

首先,你需要在pubspec.yaml文件中添加Fair的依赖:

dependencies:
  flutter:
    sdk: flutter
  fair: ^最新版本号  # 请替换为Fair插件的实际最新版本号

然后运行flutter pub get来下载依赖。

步骤2:配置Fair

main.dart文件中,你需要进行一些配置来初始化Fair。

import 'package:flutter/material.dart';
import 'package:fair/fair.dart';

void main() {
  // 初始化Fair引擎
  FairEngine.init(
    appBundlePath: "path/to/your/bundle",  // 这里是Fair包的路径,可以是本地路径,也可以是远程URL
    onCreate: (engine) {
      // 引擎创建完成后的回调
      runApp(MyApp(engine: engine));
    },
  );
}

class MyApp extends StatelessWidget {
  final FairEngine engine;

  MyApp({required this.engine});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Fair Demo'),
        ),
        body: Center(
          child: FairWidget(
            engine: engine,
            pagePath: "path/to/your/page",  // 这里是Fair页面中Dart代码的路径
          ),
        ),
      ),
    );
  }
}

步骤3:创建Fair包和页面

你需要创建一个Fair包,其中包含你的Dart代码。这个包通常是一个包含.fair扩展名的文件,你可以使用Fair提供的工具来打包你的Dart代码。

假设你有一个简单的Dart页面如下:

// saved as example_page.dart
import 'package:flutter/material.dart';

class ExamplePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('Hello, this is a dynamically loaded page!'),
    );
  }
}

你需要使用Fair的打包工具将这个Dart文件打包成一个.fair文件,并将其放置在指定的路径下(如assets/bundles/example.fair)。

步骤4:加载Fair包

确保在pubspec.yaml中配置你的Fair包路径为assets:

flutter:
  assets:
    - assets/bundles/example.fair

然后,在main.dart中更新appBundlePathpagePath为你实际的路径:

FairEngine.init(
  appBundlePath: "assets/bundles/example.fair",
  onCreate: (engine) {
    runApp(MyApp(engine: engine));
  },
);

// ...

FairWidget(
  engine: engine,
  pagePath: "example_page",  // 这里是你在Fair包中定义的Dart页面的路径(不带.dart扩展名)
)

完整示例

# pubspec.yaml
name: fair_demo
description: A new Flutter project.

version: 1.0.0+1

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  fair: ^最新版本号

flutter:
  assets:
    - assets/bundles/example.fair
// main.dart
import 'package:flutter/material.dart';
import 'package:fair/fair.dart';

void main() {
  FairEngine.init(
    appBundlePath: "assets/bundles/example.fair",
    onCreate: (engine) {
      runApp(MyApp(engine: engine));
    },
  );
}

class MyApp extends StatelessWidget {
  final FairEngine engine;

  MyApp({required this.engine});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Fair Demo'),
        ),
        body: Center(
          child: FairWidget(
            engine: engine,
            pagePath: "example_page",
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何在Flutter项目中集成Fair动态化插件,并加载一个动态页面。请注意,你需要使用Fair提供的工具来打包你的Dart代码,并确保路径配置正确。

回到顶部