firebase RemoteConfig无法按预期检索密钥

fae0ux8s  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(97)

我是Flutter/Dart/Firebase的新手,所以我可能做了一些明显错误的事情:

class RemoteConfigService {
  static final RemoteConfigService _singleton = RemoteConfigService._internal();

  factory RemoteConfigService() {
    return _singleton;
  }

  RemoteConfigService._internal();

  final FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.instance;

  Future<void> initialize() async {
    await remoteConfig.fetchAndActivate();
  }

  String get apiKey => remoteConfig.getString('apiKey');
}

现在,我试图在我的主要访问apiKey和它的作品,因为我看到它的价值打印

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  await RemoteConfigService().initialize();
  String key = RemoteConfigService().apiKey;
  print(key);
}

但当我尝试同样的观点,它不工作?

class _TestViewState extends State<TestView> {
....

Future<String> makeApiCall() async {
    String apiKey = RemoteConfigService().apiKey;  //coming back as empty
}
}

如果它已经在init期间在main()中工作了,为什么不在这里。这是一个单例类。有什么变通办法吗?
尝试了很多事情,包括在makeApiCall()方法中初始化RemoteConfigService(),但仍然显示为空。

34gzjxbg

34gzjxbg1#

不知道是什么,但我手动安装应用程序在我的手机上运行之前,“Flutter运行”,它的工作这一次。

mwg9r5ms

mwg9r5ms2#

您面临的问题可能与RemoteConfigService的初始化时间有关。当您在main()方法中调用RemoteConfigService().initialize()时,它会启动远程配置的获取和激活,但此过程需要一些时间才能完成。如果您在调用makeApiCall()后立即尝试访问apiKey,则可能尚未获取和激活配置,从而导致空值。
要处理这样的异步操作,您可以在小部件树中使用FutureBuilder。FutureBuilder允许您执行异步操作,并在操作完成后重建小部件树。
以下是如何使用FutureBuilder修改TestView类:

class TestView extends StatefulWidget {
  @override
  _TestViewState createState() => _TestViewState();
}

class _TestViewState extends State<TestView> {
  Future<String> _apiKeyFuture;

  @override
  void initState() {
    super.initState();
    _apiKeyFuture = RemoteConfigService().initialize().then((_) {
      return RemoteConfigService().apiKey;
    });
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _apiKeyFuture,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return CircularProgressIndicator(); // Show a loading indicator while fetching apiKey.
        } else if (snapshot.hasError) {
          return Text('Error: ${snapshot.error}');
        } else {
          String apiKey = snapshot.data;
          return Text('API Key: $apiKey');
        }
      },
    );
  }
}

在此修改后的代码中,RemoteConfigService的initialize()方法在initState()方法中调用,FutureBuilder小部件处理API密钥的异步获取。当API密钥被提取和激活时,显示加载指示符。操作完成后,它将显示API密钥。
确保在FutureBuilder中也适当地处理错误情况,这取决于您的用例。
通过使用FutureBuilder,您可以确保小部件在尝试访问API密钥之前等待异步操作完成,从而防止与计时和延迟相关的问题。

相关问题