我是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(),但仍然显示为空。
2条答案
按热度按时间34gzjxbg1#
不知道是什么,但我手动安装应用程序在我的手机上运行之前,“Flutter运行”,它的工作这一次。
mwg9r5ms2#
您面临的问题可能与RemoteConfigService的初始化时间有关。当您在
main()
方法中调用RemoteConfigService().initialize()
时,它会启动远程配置的获取和激活,但此过程需要一些时间才能完成。如果您在调用makeApiCall()
后立即尝试访问apiKey
,则可能尚未获取和激活配置,从而导致空值。要处理这样的异步操作,您可以在小部件树中使用FutureBuilder。FutureBuilder允许您执行异步操作,并在操作完成后重建小部件树。
以下是如何使用FutureBuilder修改TestView类:
在此修改后的代码中,RemoteConfigService的
initialize()
方法在initState()
方法中调用,FutureBuilder
小部件处理API密钥的异步获取。当API密钥被提取和激活时,显示加载指示符。操作完成后,它将显示API密钥。确保在
FutureBuilder
中也适当地处理错误情况,这取决于您的用例。通过使用
FutureBuilder
,您可以确保小部件在尝试访问API密钥之前等待异步操作完成,从而防止与计时和延迟相关的问题。