如何在应用程序启动时检查版本?
如何在应用程序启动时检查版本?
我有一个用来检查Flutter应用版本的代码,但其中包含一个无法插入到buildContext方法中的异步代码,所以我决定将其放在main方法中,并插入一个弹窗,告诉用户他需要更新应用,但我收到了这个回应:断言失败:第70行第15个位置:context!=null:不为真,因为我在我的alertDialog中将context设置为null,所以我不知道应该将它放在哪里,以便每次用户启动应用时都会运行版本检查,并在他的版本小于商店中的版本时显示alertDialog。这是我用来检查它和如何实现它的代码:
我使用NewVersion包来检查和比较本地版本和Google Play中存储的版本。
class PataStoreConnector extends StatefulWidget {
final bool loggedin;
PataStoreConnector({Key key, this.loggedin}) : super(key: key);
@override
_PataStoreConnectorState createState() => _PataStoreConnectorState();
}
class _PataStoreConnectorState extends State
bool sleeping = true;
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) {
timer();
});
super.initState();
}
@override
Widget build(BuildContext context) {
if (sleeping) {
return PataSplashScreen();
}
return StoreConnector
converter: PataViewModel.convertStateToViewModel,
builder: (BuildContext context, PataViewModel pataViewModel) {
return getPage(pataViewModel);
},
);
}
和包含检查版本代码的getPage方法:
// ignore: missing_return
Widget getPage(PataViewModel viewModel) {
//Pt.instance.version;
final newVersion = NewVersion(
androidId: 'com.snedac.empata',
context: context,
);
// setState(() async {
// VersionStatus vs = await newVersion.getVersionStatus();
// });
newVersion.getVersionStatus().then((result) {
print("store version ${result.storeVersion}");
print("local version ${result.localVersion}");
if (result.storeVersion == result.localVersion) {
if (viewModel.isLoggingIn()) {
viewModel.refreshUserData();
// vm.setIsHomeLoadedStateAction(true);
return PataSplashScreen();
}
if (!viewModel.isLoggedIn()) {
return LoginPage(
viewModel: viewModel,
);
}
print("homeloaded:${viewModel.state.isHomeloaded}");
print("userIdLogin:${viewModel.state.user.userId}");
if (viewModel.state.isHomeloaded == false) {
if (viewModel.state.user.userId > 0) {
viewModel.initHome();
} else {
return LoginPage(
viewModel: viewModel,
);
}
}
return PataHome(title: "e-Mpata");
} else {
_ackAlert2("Mise a jour", 'Votre version est trop obsolète.');
}
});
}
问题出现的原因是需要在应用启动时检查版本号,并根据版本号显示错误信息。解决方法是在main()
方法中进行异步检查,并将结果作为参数传递给根部的MyApp
组件。然后在MyApp
组件中根据参数值进行处理,可以选择在didChangeDependencies()
方法中显示对话框,或者在initState()
方法中延迟显示对话框。
具体代码如下:
import 'package:flutter/material.dart';
Future
WidgetsFlutterBinding.ensureInitialized(); // 确保插件正确初始化
final isOutOfDate = await checkAppOutOfDate(); // 进行版本检查
runApp(MyApp(isOutOfDate: isOutOfDate)); // 将检查结果作为参数传递给应用
}
class MyApp extends StatefulWidget {
final bool isOutOfDate;
MyApp({required this.isOutOfDate});
MyAppState createState() => MyAppState();
}
class MyAppState extends State
// 类似于initState(),但可以访问到实时的BuildContext
void didChangeDependencies() {
super.didChangeDependencies();
if (widget.isOutOfDate) {
showDialog(context, ...); // 使用适当的BuildContext显示对话框
}
}
Widget build(BuildContext context) {
...
}
}
如果希望在initState()
中显示对话框,则需要延迟显示,例如:
void initState() {
super.initState();
SchedulerBinding.instance!.addPostFrameCallback((_) => showDialog(context, ...));
}
不过在这种情况下,两种方法都可以达到类似的效果。