使用 firebase 远程配置的 Flutter 更新小部件

Flutter update widgets using firebase remote config

我正在开发一个 flutter 应用程序,我想更新页面的小部件而不在 Play 商店上推送新的更新。我对这个主题进行了一些研究,发现我可以使用 firebase 远程配置。我的想法是使用 firebase 远程配置来获取小部件并将它们显示在应用程序上,这样我就不需要为小的更改频繁发布更新。

例如,下面的代码用于显示一个圆形加载栏:

import 'package:flutter/material.dart';

class LoadingWidget extends StatelessWidget {
  const LoadingWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      alignment: Alignment.center,
      child: const CircularProgressIndicator(
        color: Colors.black,
      ),
    );
  }
}

但现在即使是最小的变化,比如颜色、对齐或大小的变化,我也需要将新的更新推送到 Play 商店,用户需要安装新的更新才能反映这些变化。

我想将 flutter 小部件存储在 firebase 远程配置(JSON 格式)中,然后在应用程序中,它将从远程配置中获取 JSON 数据并显示新的更改。

一旦您的 RemoteConfig,您需要添加 key-value 对以满足您的需求:

key   : value
color : black

然后获取值:

myRemoteColor = remoteConfig.getString('color')

现在,您的 myRemoteColor 有一个值为 black 的字符串。

由于您已经知道 Remote Config 仅存储原始值,因此问题变为 how to encode and decode a Flutter widget into a string

我怀疑这会很简单,因为这意味着您的应用程序需要将 JSON/string 编译成二进制文件。您实际上是在为您的远程客户端实现类似于 Flutter 的热重载的功能,这非常酷但不是 built-in 功能。

更可行的方法是控制代码中已有的特定小部件,例如。在最近的示例应用程序中,我使用 Remote Config enable/disable 一项新功能(称为功能标记的过程):

class _MyHomePageState extends State<MyHomePage> {
  final FirebaseRemoteConfig remoteConfig;

  _MyHomePageState(this.remoteConfig);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DefaultTabController(
        length: remoteConfig.getBool("chat_enabled") ? 3 : 2,
        child: Scaffold(
          appBar: AppBar(
            bottom: TabBar(
              tabs: [
                const Tab(icon: Icon(Icons.games_outlined)),
                const Tab(icon: Icon(Icons.swap_vert_circle_outlined)),
                if (remoteConfig.getBool("chat_enabled")) const Tab(icon: Icon(Icons.chat_bubble_outlined)),
              ],
            ),
            title: Text(widget.title),
          ),
          body: TabBarView(
            children: [
              const MyGame(key: Key('game')),
              const Leaderboard(key: Key('leaderboard')),
              if (remoteConfig.getBool("chat_enabled")) const Messageboard(key: Key('messageboard')),
            ],
          ),
        ),
      ),
    );
  }