Unleash Flutter 接入指南:使用 unleash_proxy_client_flutter 完成功能开关的安装、初始化与判定
【免费下载链接】unleashOpen-source feature management platform项目地址: https://gitcode.com/GitHub_Trending/un/unleash
本文以开源特性管理平台 Unleash 为背景,聚焦 Flutter(Dart)客户端如何通过官方代理客户端 SDK 快速接入:从pub安装、UnleashClient初始化与start()启动,到用isEnabled()轮询判定功能开关状态。读完本文,你将能够在任意 Flutter 应用中接入 Unleash 前端 API,实现远程配置下发与功能开关的灰度控制,并理解该接入片段在 Unleash 控制台“连接 SDK”引导流程中的真实运作方式。
一、Flutter SDK 在 Unleash 中的定位
在 Unleash 的 SDK 体系中,Flutter SDK 属于客户端 SDK(client SDK),即面向移动端/浏览器等最终用户设备运行的 SDK。这一点可以从仓库中的 SDK 注册表得到确认:SDKs.ts 将flutter注册为:
displayName:Flutter Proxy SDKdescription:Official Unleash Client for Fluttertype:client
与 Node.js、Go、Python 等服务端 SDK 直接访问常规客户端 API(/api/)不同,Flutter 这类客户端 SDK 走的是前端 API(Frontend API),地址形如https://<your-unleash-host>/api/frontend/。仓库中的 buildSdkApiUrl.ts 清晰地实现了这一分流逻辑:
const isFrontendSdk = clientSdks.some((sdk) => sdk.name === sdkName); return `${unleashUrl}/api${isFrontendSdk ? '/frontend' : ''}/`;这意味着你的YOUR_API_URL应为https://your-unleash-instance/api/frontend/,clientKey应使用在 Unleash 控制台创建的前端客户端密钥(Frontend API token)。前端 API 的设计让移动端 SDK 无需暴露服务端密钥,只需携带受限的客户端令牌即可安全地拉取功能开关状态。
二、第一步:安装 Flutter SDK 依赖
在 Flutter 项目的根目录执行以下命令,即可从 pub.dev 拉取官方代理客户端:
flutter pub add unleash_proxy_client_flutter该命令会完成两件事:
- 将
unleash_proxy_client_flutter添加到pubspec.yaml的dependencies中; - 自动执行
flutter pub get解析并下载依赖。
执行完成后,项目中即可直接import 'package:unleash_proxy_client_flutter/unleash_proxy_client_flutter.dart';使用 SDK 提供的能力。
三、第二步:初始化 UnleashClient 并启动
3.1 最小初始化示例
导入 SDK 后,创建UnleashClient实例并调用start()启动连接:
import 'package:unleash_proxy_client_flutter/unleash_proxy_client_flutter.dart'; import 'dart:async'; final unleash = UnleashClient( url: Uri.parse('<YOUR_API_URL>'), clientKey: '<YOUR_API_TOKEN>', // in production use environment variable appName: 'unleash-onboarding-flutter'); unleash.start();三个必填参数的含义如下:
| 参数 | 说明 | 取值建议 |
|---|---|---|
url | Unleash 前端 API 地址 | https://<your-unleash-host>/api/frontend/,需以Uri.parse传入 |
clientKey | 前端 API 客户端令牌 | 在 Unleash 控制台“API 访问”中创建的前端 Token;生产环境务必通过环境变量注入,而非硬编码 |
appName | 应用名称,用于在 Unleash 侧识别与统计该客户端 | 自定义字符串,例如unleash-onboarding-flutter,建议与你的应用名保持一致 |
appName会被 Unleash 用于 SDK 连接状态识别与客户端实例统计,这也是后面“连接状态自检”能生效的前提之一。
3.2 生产环境:用环境变量注入密钥
将客户端令牌硬编码进代码库存在泄露风险。SDK 片段提供了基于dart:io的生产级写法,从进程环境变量读取密钥:
import 'package:unleash_proxy_client_flutter/unleash_proxy_client_flutter.dart'; import 'dart:io'; final unleash = UnleashClient( url: Uri.parse('<YOUR_API_URL>'), clientKey: Platform.environment['UNLEASH_CLIENT_KEY']!, appName: 'unleash-onboarding-flutter'); unleash.start();Platform.environment['UNLEASH_CLIENT_KEY']!会在运行时读取名为UNLEASH_CLIENT_KEY的环境变量;若未设置,Dart 会因非空断言!抛出运行时错误——这能帮助你在启动阶段尽早发现配置缺失。在实际 CI/CD 或移动端构建流程中,可通过构建配置注入该变量。
四、第三步:使用 isEnabled 判定功能开关
SDK 启动后即可查询功能开关状态。由于前端 API 采用定期轮询拉取的更新模型,片段中使用Timer.periodic每秒轮询一次并打印结果:
Timer.periodic(Duration(seconds: 1), (Timer timer) { if (unleash.isEnabled('<YOUR_FLAG>')) { print('<YOUR_FLAG> is enabled'); } else { print('<YOUR_FLAG> is disabled'); } });isEnabled('<YOUR_FLAG>')的核心语义如下:
<YOUR_FLAG>替换为你在 Unleash 中创建的功能开关名称(flag name);- 返回
true表示当前客户端命中该开关的启用策略(例如命中灰度百分比、满足激活策略条件); - 返回
false表示开关关闭,或当前上下文不满足激活条件。
在真实 UI 场景中,isEnabled通常不会配Timer.periodic做秒级轮询,而是配合 Flutter 的响应式刷新(如setState、ValueListenableBuilder)或 SDK 提供的事件回调在开关状态变化时刷新界面。秒级轮询更适合日志输出、调试与演示场景。片段中也给出了可以直接放进build方法的最小判定块:
if (unleash.isEnabled("<YOUR_FLAG>")) { print("<YOUR_FLAG> is enabled"); } else { print("<YOUR_FLAG> is disabled"); }五、这些代码片段是如何被“个性化”的
值得注意的是,flutter.md中的<YOUR_API_URL>、<YOUR_API_TOKEN>、<YOUR_FLAG>是占位符,并非写死的固定值。当用户在 Unleash 控制台的新手引导(Onboarding)流程中选择 Flutter SDK 时,前端会动态替换这些占位符:
- CodeRenderer.tsx 通过
codeRenderSnippets将各 SDK 的 Markdown 片段以?raw方式加载,其中Flutter键对应的正是 flutter.md; - ConfigureSdk.tsx 依次执行字符串替换:
<YOUR_API_TOKEN>→ 真实 API Token、<YOUR_API_URL>→ 由 buildSdkApiUrl.ts 计算出的前端 API 地址、<YOUR_FLAG>→ 你刚创建的功能开关名; - 替换后的代码块通过
Markdown组件配合CodeRenderer渲染为带语法高亮(Dart 语言已注册在 CodeRenderer.tsx 的高亮语言表中)和“一键复制”按钮的代码块。
因此你在文档中看到的<YOUR_API_URL>、<YOUR_API_TOKEN>、<YOUR_FLAG>,在实际引导界面中会被替换为可直接运行的配置值。
六、连接状态与常见问题排查
在 Onboarding 引导中,Flutter 片段下方还会展示 SDK 连接状态组件(SdkEvaluationStatus.tsx),其逻辑是:Unleash 通过项目概览轮询(refreshInterval: 1000,见 ConfigureSdk.tsx)检测onboardingStatus.status === 'sdk-connected',一旦收到来自该 SDK 的指标上报即判定连接成功。
据此,接入失败时可从以下几个方向排查:
- API 地址是否正确:Flutter 是客户端 SDK,必须指向
/api/frontend/而非/api/; - Token 类型是否匹配:前端 API 只能使用前端客户端 Token(client-side token),使用服务端 Token 会鉴权失败;
- 应用是否真正启动:引导界面提示“如果约 30 秒后仍未看到评估结果,请确认应用已启动,且客户端使用步骤 2 中的 API 密钥完成初始化”;
appName是否与引导流程一致:指标上报依赖appName等元数据,不一致可能导致连接状态无法被识别;start()是否被调用:只创建UnleashClient而不调用start(),SDK 不会建立连接、也不会拉取功能开关数据。
七、延伸阅读建议
围绕 Flutter 接入,官方还提供了以下配套资源(均可从 Unleash 官方文档与 SDK 示例仓库获取,本文不再罗列外部链接):
- SDK 仓库文档:
unleash_proxy_client_flutter的完整 API 说明,涵盖UnleashClient的更多构造参数(如轮询间隔、自定义上下文 context 等); - Flutter 示例工程:官方 SDK 示例仓库中的 Flutter 目录,包含可直接运行的接入示例;
- A/B 测试实战指南:官方文档中关于“在 Flutter 中使用 Unleash 与 Mixpanel 实现 A/B 测试”的指南,介绍如何将功能开关与数据分析平台结合,验证实验效果。
八、小结
在 Unleash 中接入 Flutter 只需三步:flutter pub add unleash_proxy_client_flutter安装依赖 → 创建UnleashClient(配置前端 API 地址、客户端 Token 与appName)并调用start()→ 通过isEnabled()判定功能开关状态。生产环境应通过环境变量注入客户端密钥,并牢记 Flutter 走的是/api/frontend/前端 API。本文所依据的接入片段位于 frontend/src/component/onboarding/dialog/snippets/flutter.md,其占位符替换与连接状态检测机制可分别在 ConfigureSdk.tsx 与 buildSdkApiUrl.ts 中查看。
【免费下载链接】unleashOpen-source feature management platform项目地址: https://gitcode.com/GitHub_Trending/un/unleash
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考