Flutter SDK拆分管理插件flutter_split_sdk的使用

Flutter SDK拆分管理插件flutter_split_sdk的使用

flutter_split_sdk 是一个非官方的 Flutter 插件,用于集成 Split.io 的功能标志、动态配置、实验和持续交付。

开始使用

有用的链接

  1. Split 快速入门指南
  2. Split Android SDK
  3. Split iOS SDK

完整示例代码

以下是一个完整的示例代码,展示了如何使用 flutter_split_sdk 插件。

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

import 'package:flutter/services.dart';
import 'package:flutter_split_sdk/flutter_split.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _splitStatus = '未初始化。';
  late String _treatment, _treatmentWithConfig;
  late Map<String, dynamic> _config, _treatments, _treatmentsWithConfig;
  late bool _eventTracked;

  static const SPLIT_NAME_1 = "split_example_1";
  static const SPLIT_NAME_2 = "split_example_2";
  static const EVENT = "example_event";
  static const TRAFFIC_TYPE = "user";

  // 实例化插件
  final FlutterSplit flutterSplit = FlutterSplit();

  @override
  void initState() {
    super.initState();
    initSplitPlugin();
  }

  // 使用 API 密钥和用户 ID 初始化插件
  Future<void> initSplitPlugin() async {
    // 替换为您的实际密钥。
    // 示例密钥无法正常工作。
    const SPLIT_API_KEY = 'default_example_key';

    String splitStatus;

    try {
      await flutterSplit.initializeSdk(SPLIT_API_KEY, "uid");
      splitStatus = '已初始化';
    } on PlatformException {
      splitStatus = '初始化失败。';
    }

    if (!mounted) return;

    setState(() {
      _splitStatus = splitStatus;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Split.io Flutter 插件示例'),
        ),
        body: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12),
          child: Container(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              mainAxisSize: MainAxisSize.min,
              children: [
                Text(
                  '插件状态: $_splitStatus\n',
                  maxLines: 2,
                ),
                SizedBox(height: 16),
                Text(
                  '1. 分割 ${SPLIT_NAME_1} 的处理结果: $_treatment\n',
                  maxLines: 3,
                ),
                SizedBox(height: 8),
                Text(
                  '2. 分割 ${SPLIT_NAME_1} 的处理结果(带配置): $_treatmentWithConfig, $_config\n',
                  maxLines: 16,
                  overflow: TextOverflow.ellipsis,
                ),
                SizedBox(height: 8),
                Text(
                  '3. 多个分割的处理结果: $_treatments\n',
                  maxLines: 16,
                ),
                SizedBox(height: 8),
                Text(
                  '4. 多个分割的处理结果(带配置): $_treatmentsWithConfig\n',
                  maxLines: 16,
                ),
                SizedBox(height: 8),
                Text(
                  '5. 事件 $EVENT 跟踪: $_eventTracked\n',
                  maxLines: 3,
                ),
                SizedBox(height: 8),
              ],
            ),
          ),
        ),
        floatingActionButton: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          mainAxisSize: MainAxisSize.min,
          children: [
            FloatingActionButton.extended(
              label: Text('1. 评估分割'),
              onPressed: () async {
                String treatment =
                    await flutterSplit.getTreatment(SPLIT_NAME_1, {}) ?? '';
                setState(() {
                  _treatment = treatment;
                });
              },
            ),
            SizedBox(height: 8),
            FloatingActionButton.extended(
              label: Text('2. 评估分割(带配置)'),
              onPressed: () async {
                var result =
                    await flutterSplit.getTreatmentWithConfig(SPLIT_NAME_1, {});
                setState(() {
                  _treatmentWithConfig = result?.treatment ?? '';
                  _config = result?.config ?? {};
                });
              },
            ),
            SizedBox(height: 8),
            FloatingActionButton.extended(
              label: Text('3. 评估多个分割'),
              onPressed: () async {
                var result = await flutterSplit
                    .getTreatments([SPLIT_NAME_1, SPLIT_NAME_2], {});
                setState(() {
                  _treatments = result;
                });
              },
            ),
            SizedBox(height: 8),
            FloatingActionButton.extended(
              label: Text('4. 评估多个分割(带配置)'),
              onPressed: () async {
                var result = await flutterSplit
                    .getTreatmentsWithConfig([SPLIT_NAME_1, SPLIT_NAME_2], {});
                setState(() {
                  _treatmentsWithConfig = result;
                });
              },
            ),
            SizedBox(height: 8),
            FloatingActionButton.extended(
              label: Text('5. 跟踪事件'),
              onPressed: () async {
                var result =
                    await flutterSplit.trackEvent(EVENT, TRAFFIC_TYPE, {});
                setState(() {
                  _eventTracked = result ?? false;
                });
              },
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 初始化插件:

    Future<void> initSplitPlugin() async {
      const SPLIT_API_KEY = 'default_example_key';
      try {
        await flutterSplit.initializeSdk(SPLIT_API_KEY, "uid");
        splitStatus = '已初始化';
      } on PlatformException {
        splitStatus = '初始化失败。';
      }
      if (!mounted) return;
      setState(() {
        _splitStatus = splitStatus;
      });
    }
    

    这段代码初始化了 flutter_split_sdk 插件,并使用 API 密钥和用户 ID 进行初始化。

  2. 评估分割:

    FloatingActionButton.extended(
      label: Text('1. 评估分割'),
      onPressed: () async {
        String treatment =
            await flutterSplit.getTreatment(SPLIT_NAME_1, {}) ?? '';
        setState(() {
          _treatment = treatment;
        });
      },
    )
    

    这段代码通过调用 getTreatment 方法来获取指定分割的处理结果。

  3. 评估分割(带配置):

    FloatingActionButton.extended(
      label: Text('2. 评估分割(带配置)'),
      onPressed: () async {
        var result =
            await flutterSplit.getTreatmentWithConfig(SPLIT_NAME_1, {});
        setState(() {
          _treatmentWithConfig = result?.treatment ?? '';
          _config = result?.config ?? {};
        });
      },
    )
    

    这段代码通过调用 getTreatmentWithConfig 方法来获取指定分割的处理结果及配置信息。

  4. 评估多个分割:

    FloatingActionButton.extended(
      label: Text('3. 评估多个分割'),
      onPressed: () async {
        var result = await flutterSplit
            .getTreatments([SPLIT_NAME_1, SPLIT_NAME_2], {});
        setState(() {
          _treatments = result;
        });
      },
    )
    

    这段代码通过调用 getTreatments 方法来获取多个分割的处理结果。

  5. 评估多个分割(带配置):

    FloatingActionButton.extended(
      label: Text('4. 评估多个分割(带配置)'),
      onPressed: () async {
        var result = await flutterSplit
            .getTreatmentsWithConfig([SPLIT_NAME_1, SPLIT_NAME_2], {});
        setState(() {
          _treatmentsWithConfig = result;
        });
      },
    )
    

    这段代码通过调用 getTreatmentsWithConfig 方法来获取多个分割的处理结果及配置信息。

  6. 跟踪事件:

    FloatingActionButton.extended(
      label: Text('5. 跟踪事件'),
      onPressed: () async {
        var result =
            await flutterSplit.trackEvent(EVENT, TRAFFIC_TYPE, {});
        setState(() {
          _eventTracked = result ?? false;
        });
      },
    )
    

更多关于Flutter SDK拆分管理插件flutter_split_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter SDK拆分管理插件flutter_split_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_split_sdk 是一个用于在 Flutter 应用中实现 SDK 拆分管理的插件。它允许你将应用的不同部分(如模块、功能、UI 等)拆分成独立的 SDK,并在运行时动态加载和管理这些 SDK。这对于大型应用、插件化架构或需要动态更新部分功能的场景非常有用。

以下是如何使用 flutter_split_sdk 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_split_sdk: ^latest_version

然后运行 flutter pub get 来获取依赖。

2. 初始化 flutter_split_sdk

在你的 Flutter 应用启动时,初始化 flutter_split_sdk。通常可以在 main.dart 中进行初始化:

import 'package:flutter_split_sdk/flutter_split_sdk.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 Split SDK
  await SplitSdk.initialize();

  runApp(MyApp());
}

3. 加载和管理 SDK

使用 flutter_split_sdk 可以动态加载和管理不同的 SDK。以下是一个简单的示例,展示如何加载一个 SDK:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Split SDK Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 加载一个 SDK
              final sdk = await SplitSdk.loadSdk('path_to_sdk');

              if (sdk != null) {
                // 使用 SDK 中的功能
                sdk.executeFunction('function_name');
              } else {
                print('Failed to load SDK');
              }
            },
            child: Text('Load SDK'),
          ),
        ),
      ),
    );
  }
}

4. 创建和打包 SDK

flutter_split_sdk 需要你将应用的不同部分打包成独立的 SDK。通常,你可以通过以下步骤来创建和打包 SDK:

  1. 创建独立的 Flutter 模块:将你希望拆分的功能或模块创建为独立的 Flutter 模块。
  2. 打包为 AAR 或 IPA:将 Flutter 模块打包为 Android 的 AAR 文件或 iOS 的 IPA 文件。
  3. 动态加载:在应用运行时,使用 flutter_split_sdk 动态加载这些 AAR 或 IPA 文件。

5. 处理 SDK 中的依赖

如果你在 SDK 中使用了其他依赖项,确保这些依赖项在加载时可用。你可以通过 SplitSdk 提供的依赖管理功能来处理这些依赖。

6. 更新和卸载 SDK

flutter_split_sdk 还支持动态更新和卸载 SDK。你可以通过以下代码来更新或卸载 SDK:

// 更新 SDK
await SplitSdk.updateSdk('path_to_updated_sdk');

// 卸载 SDK
await SplitSdk.unloadSdk('sdk_id');

7. 处理错误和异常

在使用 flutter_split_sdk 时,可能会遇到各种错误和异常,例如加载失败、依赖冲突等。确保你在代码中处理这些异常,并提供用户友好的错误提示。

try {
  final sdk = await SplitSdk.loadSdk('path_to_sdk');
  sdk.executeFunction('function_name');
} catch (e) {
  print('Error loading SDK: $e');
}
回到顶部