2

基本上我想在应用程序启动时加载firebase远程配置参数并在创建商店时将其存储在应用程序状态中。

因此,每当我需要它时,我只需从商店中获取它并获取 remoteConfig 值。

class App extends StatelessWidget {
// Get firebase remote config and store it in appState 
 ---> final store = createStore();

 App();

  @override
  Widget build(BuildContext context) {
    return new PersistorGate(
      persistor: persistor,
      loading: new LoadingScreen(),
      builder: (context) => new StoreProvider<AppState>(
          store: store,
          child: new MaterialApp(
            title: 'TestApp',
            theme: defaultTargetPlatform == TargetPlatform.iOS
                ? kIOSTheme
                : kDefaultTheme,
            routes: getRoutes(context, store),
            initialRoute: '/login',
          )),
    );
  }
}

创建存储文件 -

Store<AppState> createStore() { 
    Store<AppState> store = new Store(
        appReducer,
        // store remote config in initial app state
        initialState: new AppState(),
        middleware: createMiddleware(),
    );
    persistor.load(store);

    return store;
}
4

1 回答 1

1

我遵循了这种方法-

  1. 使用 FutureBuilder
  2. 异步获取远程配置future
  3. 使用获取的创建商店remoteConfig

我实施了以下解决方案 - 寻找除此之外的任何其他可能的方法。

编辑:

在某些情况下,您可能无法从 firebase 获取远程配置,或者某些异步操作失败,在这种情况下,您将不得不检查快照是否有数据并显示一些后备用户界面。

例如

if(snapshot.hasData) {
  // render component
} else {
  // render loader
}

代码:

 @override
  Widget build(BuildContext context) {
    return new FutureBuilder<Store>(
        future: setupRemoteConfig(),
        builder: (BuildContext context, AsyncSnapshot<Store> snapshot) {
          return new PersistorGate(
            persistor: persistor,
            loading: new LoadingScreen(),
            builder: (context) =>
            new StoreProvider<AppState>(
                store: snapshot.data,
                child: new MaterialApp(
                  title: 'Test App',
                  theme: defaultTargetPlatform == TargetPlatform.iOS
                      ? kIOSTheme
                      : kDefaultTheme,
                  routes: getRoutes(context, snapshot.data),
                  initialRoute: '/login',
                )
            ),
          );
        }
    );
  }

RemoteConfig: 获取 remoteConfig 异步方式

  Future<Store> setupRemoteConfig() async {
    final RemoteConfig remoteConfig = await RemoteConfig.instance;
    // Enable developer mode to relax fetch throttling
    remoteConfig.setConfigSettings(new RemoteConfigSettings(debugMode: true));
    remoteConfig.setDefaults(<String, dynamic>{
      'welcome': 'default welcome',
    });

    await remoteConfig.fetch(expiration: const Duration(hours: 5));
    await remoteConfig.activateFetched();

    return createStore(remoteConfig);

  }

创建商店:

Store<AppState> createStore(RemoteConfig config) {
    Store<AppState> store = new Store(
        appReducer,
        initialState: new AppState(config: config),
        middleware: createMiddleware(),
    );

    persistor.load(store);

    return store;
}
  • 持久性来自

    导入'包:redux_persist_flutter/redux_persist_flutter.dart';

它用于在商店中补充旧状态。

于 2018-07-27T05:11:46.217 回答