Flutter特性开关管理插件splitio的使用

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

Flutter特性开关管理插件splitio的使用

概述

splitio 是一个官方的Flutter插件,用于与Split平台进行集成。Split是一个控制发布功能的平台,通过特征标志(feature flags)向用户提供功能,并管理您的完整客户体验。

兼容性

Android iOS
支持 SDK 21+ iOS 9+

快速入门

在您的 pubspec.yaml 文件中添加 splitio 作为依赖项:

dependencies:
  splitio: ^latest_version

下面是一个如何执行评估的小示例:

import 'package:splitio/splitio.dart';

final Splitio _split = Splitio('YOUR_SDK_KEY', 'USER_KEY');

/// 获取处理结果
_split.client(onReady: (client) async {
  final String treatment = await client.getTreatment('FEATURE_FLAG_NAME');

  if (treatment == 'on') {
    /// 插入代码以显示“开启”处理结果
  } else if (treatment == 'off') {
    /// 插入代码以显示“关闭”处理结果
  } else {
    /// 插入控制处理结果代码
  }
});

更多详细的使用示例可以参考 这里

完整示例Demo

以下是一个完整的Flutter应用程序示例,展示如何使用 splitio 插件:

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

const String _sdkKey = 'sdk-key'; // 替换为有效的SDK Key
const String _matchingKey = 'user-id'; // 替换为有效的用户ID

void main() {
  runApp(const SplitioExampleApp());
}

class SplitioExampleApp extends StatefulWidget {
  const SplitioExampleApp({Key? key}) : super(key: key);

  @override
  State<SplitioExampleApp> createState() => _SplitioExampleAppState();
}

class _SplitioExampleAppState extends State<SplitioExampleApp> {
  String _featureFlagName = '';
  bool _sdkReady = false;
  bool _sdkReadyFromCache = false;
  late SplitClient _client;

  final Splitio _split = Splitio(_sdkKey, _matchingKey,
      configuration: SplitConfiguration(
        trafficType: "user",
      ));

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

  void _initClients() {
    _client = _split.client(
        matchingKey: _matchingKey,
        onReady: (client) {
          setState(() {
            _sdkReady = true;
          });
        });

    _client.whenReadyFromCache().then((value) {
      setState(() {
        _sdkReadyFromCache = true;
      });
    });

    _client.setAttributes({
      'name': 'splitio',
      'age': 1,
      'available': true,
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('split.io example app'),
        ),
        body: SingleChildScrollView(
          child: Padding(
            padding: const EdgeInsets.all(8),
            child: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  Text(
                    'SDK ready: $_sdkReady',
                    style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 24),
                  ),
                  Text(
                    'SDK ready from cache: $_sdkReadyFromCache',
                    style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 24),
                  ),
                  Padding(
                    padding: const EdgeInsets.fromLTRB(32, 8, 32, 8),
                    child: TextField(
                      decoration: const InputDecoration(hintText: 'Enter feature flag name'),
                      onChanged: (text) {
                        setState(() {
                          _featureFlagName = text;
                        });
                      },
                    ),
                  ),
                  Visibility(
                    visible: _featureFlagName != '',
                    child: ElevatedButton(
                      onPressed: performEvaluation,
                      child: Text('Evaluate: $_featureFlagName'),
                    ),
                  ),
                  Visibility(
                    visible: _sdkReady || _sdkReadyFromCache,
                    child: Column(
                      children: [
                        ElevatedButton(
                          onPressed: track,
                          child: const Text('Track event'),
                        ),
                        ElevatedButton(
                          onPressed: getAttributes,
                          child: const Text('Get attributes'),
                        ),
                        ElevatedButton(
                          onPressed: removeAttribute,
                          child: const Text('Remove age attribute'),
                        ),
                        ElevatedButton(
                          onPressed: flush,
                          child: const Text('Flush'),
                        ),
                        ElevatedButton(
                          onPressed: destroy,
                          child: const Text('Destroy'),
                        ),
                      ],
                    ),
                  ),
                  Visibility(
                    visible: !(_sdkReady || _sdkReadyFromCache),
                    child: const CircularProgressIndicator(),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }

  void performEvaluation() async {
    _client.getTreatment(_featureFlagName).then((value) {
      print('Evaluation value for $_featureFlagName is $value');
    });
  }

  void track() {
    _client.track("event-type", trafficType: "account", value: 25, properties: {
      "age": 50
    }).then((value) => print('Track result is: ' + value.toString()));
  }

  void getAttributes() async {
    var attributes = await _client.getAttributes();
    print('Attribute values: ' + attributes.toString());
  }

  void removeAttribute() async {
    _client.removeAttribute('age');
  }

  void flush() async {
    _client.flush();
  }

  void destroy() async {
    _client.destroy();
  }

  @override
  void dispose() {
    destroy();
    super.dispose();
  }
}

此示例展示了如何初始化Split客户端、设置用户属性、从缓存加载数据以及执行各种操作,如获取特征标志、跟踪事件和销毁客户端等。

提交问题

您可以在 GitHub issue tracker 上提交任何问题、反馈或功能增强请求。Split团队会监控所有提交的问题,并尽力及时回复。

贡献

请参阅 贡献者指南 了解如何提交Pull Request (PR)。

许可证

根据Apache License 2.0版本授权。更多信息请查看 Apache License

关于Split

Split是领先的特征交付平台,帮助工程团队快速部署特征。更多关于Split的信息,请访问 split.io/product 或查阅 文档


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

1 回复

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


在Flutter应用中,使用Split.io进行特性开关管理可以帮助你轻松地在生产环境中控制功能的开关状态。Split.io提供了强大的AB测试和特性管理功能,使得你可以在不重新发布应用的情况下,动态地开启或关闭功能。

下面是一个简单的示例,展示如何在Flutter应用中使用Split.io插件。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加Split.io的Flutter SDK依赖。请注意,实际使用时,你应该检查Split.io的官方文档以获取最新的依赖版本。

dependencies:
  flutter:
    sdk: flutter
  split_io_flutter: ^x.y.z  # 替换为实际的版本号

2. 初始化Split.io客户端

在你的Flutter应用的入口文件(通常是main.dart)中,初始化Split.io客户端。你需要提供Split.io的API密钥和其他必要的配置。

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

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

  // 初始化Split.io客户端
  await SplitClient.factory.init(
    apiKey: 'YOUR_SPLIT_IO_API_KEY', // 替换为你的API密钥
    core: Core(
      authorizationKey: 'YOUR_AUTHORIZATION_KEY', // 如果需要的话
      key: 'YOUR_SDK_KEY', // 如果需要的话
      scheduler: Scheduler(featuresRefreshRate: 30), // 特性刷新频率,单位为秒
      events: Events(
        bulkSize: 10,
        flushInterval: 5,
      ),
      storage: Storage(prefix: 'splitio_'),
      metrics: Metrics(enabled: true),
      logger: Logger(level: LogLevel.DEBUG), // 可以根据需要调整日志级别
    ),
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Split.io Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

3. 使用特性开关

在你的应用逻辑中,你可以使用Split.io客户端来检查某个特性的开关状态,并根据状态来决定是否显示或启用该功能。

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _isFeatureEnabled = false;

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

    // 检查特性开关状态
    SplitClient.factory.client.getTreatment(
      'feature_name', // 替换为你的特性名称
      attributes: {'user_id': '12345'}, // 用户属性,可以根据需要自定义
    ).then((treatment) {
      setState(() {
        _isFeatureEnabled = treatment == 'on'; // 假设'on'表示特性已开启
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Split.io Demo'),
      ),
      body: Center(
        child: _isFeatureEnabled
            ? Text('Feature is enabled!')
            : Text('Feature is disabled.'),
      ),
    );
  }
}

注意事项

  1. API密钥和配置:确保你使用的是正确的API密钥和其他配置参数。
  2. 特性名称和属性:在调用getTreatment方法时,确保使用正确的特性名称和用户属性。
  3. 错误处理:在实际应用中,你应该添加适当的错误处理逻辑,以处理Split.io客户端初始化失败或特性检查失败的情况。

这个示例展示了如何在Flutter应用中使用Split.io进行特性开关管理。根据你的具体需求,你可能需要调整代码以适应你的应用场景。

回到顶部