当应用程序不需要更新并且不会出现UpgradeAlert或UpgradeCard时,如何让升级程序推送到新的Navigator路线?

问题描述 投票:0回答:1

在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

flutter flutter-dependencies app-update materialpageroute
1个回答
0
投票

而不是在主 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:

© www.soinside.com 2019 - 2024. All rights reserved.