如何在应用程序启动时检查版本?

8 浏览
0 Comments

如何在应用程序启动时检查版本?

我有一个用来检查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.');

}

});

}

0
0 Comments

问题出现的原因是需要在应用启动时检查版本号,并根据版本号显示错误信息。解决方法是在main()方法中进行异步检查,并将结果作为参数传递给根部的MyApp组件。然后在MyApp组件中根据参数值进行处理,可以选择在didChangeDependencies()方法中显示对话框,或者在initState()方法中延迟显示对话框。

具体代码如下:

import 'package:flutter/material.dart';

Future main() async {

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, ...));

}

不过在这种情况下,两种方法都可以达到类似的效果。

0