在materialApp中,我正在home属性中使用upgrader来显示upgraderAlert,以显示有一个应用程序更新待处理并且需要更新该应用程序(我想让它强制升级)。
这是我的材料应用程序的代码,它之后会进入启动屏幕(如果我不使用升级程序并使用原始工作流程)。
import 'dart:io';
import 'package:big_daddy_live_line_new/core/core.dart';
import 'package:big_daddy_live_line_new/main.dart';
import 'package:big_daddy_live_line_new/resources/src/theme/bloc/theme_bloc.dart';
import 'package:big_daddy_live_line_new/resources/src/theme/theme.dart';
import 'package:big_daddy_live_line_new/src/app/route/routes.dart';
import 'package:big_daddy_live_line_new/src/l10n/l10n.dart';
import 'package:big_daddy_live_line_new/src/ui/splash/splash_screen.dart';
import 'package:big_daddy_live_line_new/updates_checker.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:upgrader/upgrader.dart';
import '../di/dependency.dart';
import 'localization/localization_cubit.dart';
export 'bloc_observer.dart';
export 'localization/localization_cubit.dart';
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp>
with SingletonsMixin, WidgetsBindingObserver {
late final AppRouteGenerator _routeGenerator = AppRouteGenerator();
late final routeObserver = this<RouteObserver>();
bool willDisplay = false;
late String route;
@override
void initState() {
WidgetsBinding.instance.addObserver(this);
super.initState();
init();
}
void init() async {
await Upgrader.clearSavedSettings();
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
String get initialRoute {
return UpdateChecker.routeName;
// return SplashScreen.routeName;
}
@override
Widget build(BuildContext context) {
final localizationState =
BlocProvider.of<LocalizationCubit>(context, listen: true).state;
final themeState = BlocProvider.of<ThemeBloc>(context, listen: true).state;
return MaterialApp(
onGenerateTitle: (context) => context.l10n.appName,
navigatorKey: navigatorKey,
navigatorObservers: [routeObserver],
debugShowCheckedModeBanner: false,
themeMode: themeState.themeMode,
theme: AppTheme.lightTheme,
darkTheme: AppTheme.darkTheme,
onGenerateRoute: _routeGenerator,
// initialRoute: initialRoute,
locale: localizationState.locale,
supportedLocales: localizationState.supportedLocales,
localizationsDelegates: const [
AppLocalization.delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
home: UpgradeAlert(
upgrader: Upgrader(
durationUntilAlertAgain: Duration(seconds: 5),
canDismissDialog: false,
shouldPopScope: () {
if (Platform.isAndroid) {
Future.delayed(const Duration(milliseconds: 1000), () {
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
});
} else if (Platform.isIOS) {
Future.delayed(const Duration(milliseconds: 1000), () {
exit(0);
});
}
return true;
},
),
navigatorKey: navigatorKey,
),
);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) {
case AppLifecycleState.resumed:
case AppLifecycleState.inactive:
case AppLifecycleState.paused:
case AppLifecycleState.detached:
}
super.didChangeAppLifecycleState(state);
}
}
当使用材质应用程序的initialRoute 属性时,启动屏幕会在UpgradeAlert 下加载。
启动画面在计时器上运行,计时器用完后,它根据条件加载下一个屏幕。
onLoaded: (composition) {
_controller
..duration = composition.duration
..forward().whenComplete(
// () async {
// context.navigator.pushReplacementNamed(
// UpdateChecker.routeName);
// }
() async {
if (box.read('sportSelected') != null) {
if (box.read('sportSelected') ==
"Cricket") {
context.navigator.pushReplacementNamed(
HomeScreen.routeName);
setState(() {
loadNextScreen = false;
});
} else if (box.read('sportSelected') ==
"Football") {
context.navigator.pushReplacementNamed(
HomeScreenFootball.routeName);
setState(() {
loadNextScreen = false;
});
} else {
context.navigator.pushReplacementNamed(
SportSelectionScreen.routeName);
setState(() {
loadNextScreen = false;
});
}
} else {
context.navigator.pushReplacementNamed(
SportSelectionScreen.routeName);
setState(() {
loadNextScreen = false;
});
}
},
);
},
在初始屏幕上的计时器用完后,由于导航器的 PushReplacementNamed,upgradeAlert 小部件也会被删除。但加载后需要弹出闪屏。
如果upgraderAlert显示对话框,任何人都可以告诉我如何使其工作或实现upgraderAlert而不触发启动画面的任何解决方案。
如果 currentAppVersion 和 PlayStoreAppVersion 不同,但无法获取 PlayStoreAppVersion 进行比较,我尝试应用条件加载具有不同脚手架的启动屏幕或 UpgraderAleart 屏幕。
我还尝试在材质应用程序中设置一个条件,以便在upgrader.willDisplay为true但仅提供null作为返回时加载初始屏幕或空白脚手架的初始路由。
我不知道如何使用upgradeAlert.navigatorKey进行路由,因为文档中的示例没有解释如何在不使用goRouter或任何其他示例的情况下使用它。此外,在该示例中,如果升级程序不显示对话框,则仍会加载第二个屏幕,但不会显示如何切换到屏幕 1。链接:https://pub.dev/packages/upgrader/install ||| https://github.com/larryaasen/upgrader/blob/master/example/lib/main-gorouter.dart
而不是在主 MaterialApp 小部件中使用 UpgradeAlert。您只需在要显示弹出对话框的屏幕上使用它即可。
例如:
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return UpgradeAlert(
navigatorKey: routerConfig.routerDelegate.navigatorKey, // only required with goroute.
child: Scaffold(
// rest of your home page
),
);
}
}
如果你不使用 goroute,可以删除 navigatorKey:。