Flutter:热重载后应用程序不断返回初始路线

2024-04-03

我刚刚按照迁移指南将 FireBase 插件升级到最新版本https://firebase.flutter.dev/docs/migration https://firebase.flutter.dev/docs/migration并开始注意到,每当我进行热重载时,我的应用程序都会进行热重启并返回到初始路线。首先我认为这可能是 Android Studio 问题,所以我也尝试通过命令提示符和 VS code,但结果相同。我搜索了与该主题相关的旧 Stackoverflow 问题,但找不到任何可以解决该问题的内容。 我正在复制下面的代码。 PS:我对 Flutter 还很陌生,这是我在 stackoverflow 上遇到的第一个问题。

非常感谢任何帮助。 编辑:刚刚调试它,发现执行热重载时它会返回到 runApp(...) 。

main.dart

void main() async {
  String authMethod;
  WidgetsFlutterBinding.ensureInitialized();
  SharedPreferenceService localStorage = SharedPreferenceService();
  authMethod = await localStorage.getAuthMode();
  print("Authentication Mode $authMethod");
  setupLocator();


  runApp(
    DevicePreview(
        enabled: false,//kReleaseMode,
        builder: (context)=>AppInitialization())
      );
}

应用程序初始化.dart

class AppInitialization extends StatelessWidget {
  final Future<FirebaseApp> _initialization = Firebase.initializeApp();
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _initialization,
        builder: (context, snapshot) {
        if (snapshot.hasError) {
          return Center(
            child: Container(
              child: Text('Unable to Initialize FireBase'),
            ),
          );
        }
        if (snapshot.connectionState == ConnectionState.done) {
          print("======= F I R E  B A S E  A P P ========");
          return LocalGroceryOnline();
        }
        return Center(
          child: SizedBox(
            height: 40,
            width: 40,
            child: CircularProgressIndicator(
                strokeWidth: 2.0,
                valueColor: AlwaysStoppedAnimation<Color>(Colors.redAccent, )),
          ),
        );

        });
  }
}

本地杂货在线.dart

class LocalGroceryOnline extends StatelessWidget {
  final GlobalKey<NavigatorState> navigatorKey = new GlobalKey<NavigatorState>();
  @override
  Widget build(BuildContext context) {    
    return MultiProvider  (
      providers: [
        Provider<FirebaseAuthService>(create: (_) => FirebaseAuthService()),
        Provider<SignInHelperService>(create: (_) => SignInHelperService()),
        Provider<SharedPreferenceService>(create: (_) => SharedPreferenceService()),
        ChangeNotifierProvider<CartModel>(create: (_) => CartModel()),
        ChangeNotifierProvider<UserModel>(create: (_) => UserModel()),
        ChangeNotifierProvider<ProductModel>(create: (_) => ProductModel()),
        ChangeNotifierProvider<cat.Category>(create: (_) => cat.Category()),
        ChangeNotifierProvider<AppSetting>(create: (_) => AppSetting()),
        ChangeNotifierProvider<ValueNotifier<bool>>(create: (_) => ValueNotifier<bool>(false),),
        ChangeNotifierProvider<ValueNotifier<int>>(create: (_) => ValueNotifier<int>(0),)

      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Online Local Grocery',
        locale: DevicePreview.of(context).locale,
        builder: DevicePreview.appBuilder,
        theme: ThemeData(
          primaryColor: Colors.white,
          fontFamily: 'Montserrat',
          appBarTheme: AppBarTheme(elevation: 0.0), //This is important

        ),
        initialRoute: AuthWidget.id,
        navigatorKey: navigatorKey,

        onGenerateRoute: RouteGenerator.generateRoute,
        //onGenerateInitialRoutes: InitialRouteGenerator.generateRoute(),
      )
          ,
    );
  }
}

路线生成器.dart

class RouteGenerator {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    final args = settings.arguments;

    switch (settings.name) {
      case AuthWidget.id:
        return MaterialPageRoute(builder: (_) => AuthWidget());

      case SignUpSelectionScreen.id:
        return MaterialPageRoute(builder: (_) => SignUpSelectionScreen());
      case SignupForm.id:
        return MaterialPageRoute(builder: (_) => SignupForm());
      case LoginView.id:
        return MaterialPageRoute(builder: (_) => LoginView());
      case HomePage.id:
        return MaterialPageRoute(builder: (_) => HomePage());
      case MainPage.id:
        if (args.runtimeType == MainCategory) {
          return MaterialPageRoute(
              builder: (_) => MainPage(
                mainCategory: args,
              ));
        }
        return _errorRoute();
      case ProductDetail.id:
        if (args.runtimeType == SelectedProductArguments) {
          return MaterialPageRoute(
              builder: (_) => ProductDetail(
                    selectedProductArguments: args,
                  ));
        }
        return _errorRoute();
      case CheckOutScreen.id:
        return MaterialPageRoute(builder: (_) => CheckOutScreen());
      case Admin.id:
        return MaterialPageRoute(builder: (_) => Admin());
      case ScrapBoard.id:
        return MaterialPageRoute(builder: (_) => ScrapBoard());
      case ProductAdminView.id:
        return MaterialPageRoute(builder: (_) => ProductAdminView());
      case DeliveryAddressView.id:
        return MaterialPageRoute(builder: (_) => DeliveryAddressView());
      case PaymentView.id:
        return MaterialPageRoute(builder: (_) => PaymentView());
      case OrderProcessingView.id:
        return MaterialPageRoute(builder: (_) => OrderProcessingView());
      case MyOrdersView.id:
        return MaterialPageRoute(builder: (_) => MyOrdersView());
      case MyOrderDetails.id:
        if (args.runtimeType == Order) {
        return MaterialPageRoute(builder: (_) => MyOrderDetails(
          order: args,
        )
         );
        }
        return _errorRoute();

      default:
        // If there is no such named route in the switch statement, e.g. /third
        return _errorRoute();
    }
  }

  static Route<dynamic> _errorRoute() {
    return MaterialPageRoute(builder: (_) {
      return Scaffold(
        appBar: AppBar(
          title: Text('Error'),
        ),
        body: Center(
          child: Text('ERROR'),
        ),
      );
    });
  }
}

class InitialRouteGenerator {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    bool _firstTimeAppUsed;
    final localStorage = new SharedPreferenceService();
    localStorage.isFirstTimeAppUsed().then((bool value) {
      if (value == true) {
        _firstTimeAppUsed = true;
      }
    });
    if (_firstTimeAppUsed) {
      return MaterialPageRoute(builder: (_) => SignUpSelectionScreen());
    }
    return MaterialPageRoute(builder: (_) => HomePage());
  }
}

AuthWidget.dart

class AuthWidget extends StatelessWidget {
  static const id = "auth_widget";

  @override
  Widget build(BuildContext context) {
    print("Auth Widget...");
    final authService =
        Provider.of<FirebaseAuthService>(context, listen: false);
    final userModel = Provider.of<UserModel>(context, listen: false);
    final signInHelperService = Provider.of<SignInHelperService>(context, listen: false);

    return StreamBuilder(
        stream: authService.onAuthStateChanged,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.active) {
            print ("INSIDE AUTH WIDGET");
            final user = snapshot.data;
            if (user != null) {
              print("${user.uid} ${user.userName} ${user.photoUrl}");
              userModel.user = user;
              return StreamBuilder(
                  stream: FirebaseFirestore.instance
                      .collection('users')
                      .doc(user.uid)
                      .get().asStream(),
                  builder: (context, userSnapshot) {
                    if (userSnapshot.hasData && snapshot.connectionState == ConnectionState.active) {
                      final userDocument = userSnapshot.data;
                      if (userDocument != null) {
                        print("------ Data Found -------");
                        AppUser user = AppUser.fromMap(userDocument);
                        //bool signUpComplete = userDocument["signUpComplete"];
                        bool signUpComplete = user.signUpComplete;
                        if (signUpComplete == null) signUpComplete = false;
                        if (!signUpComplete) {
                          print("userModel.user UID ${userModel.user.uid}");
                          return SignupForm();
                        } else {
                          AppUser user2 = AppUser.fromMap(userDocument);
                          userModel.user = user2;
                          print('User Level ..... ${userModel.user.userLevel}');
                          signInHelperService.getAndUpdateDeviceToken(user2);

                          return HomePage(); //MainPage();
                        }
                      }
                    }
                    return emptyScaffoldWithProgress();
                  });
            }
            return SignUpSelectionScreen();
          }
          return emptyScaffoldWithProgress();
        });
  }

  Scaffold emptyScaffoldWithProgress() {
    return Scaffold(
      body: Center(
        child: SizedBox(
          height: 90,
          width: 90,
          child: CircularProgressIndicator(
              strokeWidth: 5.0,
              valueColor: AlwaysStoppedAnimation<Color>(Colors.redAccent)),
        ),
      ),
    );
  }
}

扑动医生-v

[√] Flutter (Channel stable, 1.22.4, on Microsoft Windows [Version 10.0.19041.630], locale en-US)
    • Flutter version 1.22.4 at C:\src\flutter
    • Framework revision 1aafb3a8b9 (3 weeks ago), 2020-11-13 09:59:28 -0800
    • Engine revision 2c956a31c0
    • Dart version 2.10.4


[√] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    • Android SDK at C:\Users\Jamal\AppData\Local\Android\sdk
    • Platform android-29, build-tools 29.0.3
    • Java binary at: C:\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)
    • All Android licenses accepted.

[√] Android Studio (version 4.0)
    • Android Studio at C:\Android\Android Studio
    • Flutter plugin version 47.1.2
    • Dart plugin version 193.7361
    • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)

[√] VS Code (version 1.51.1)
    • VS Code at C:\Users\Jamal\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.17.0

[√] Connected device (1 available)
    • Android SDK built for x86 (mobile) • emulator-5554 • android-x86 • Android 10 (API 29) (emulator)

• No issues found!

在 Flutter 3.3.0 中使用 onGenerateRoute 时遇到同样的问题,但没有任何上述问题。 通过在MaterialApp上添加home解决

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter:热重载后应用程序不断返回初始路线 的相关文章

随机推荐

  • 会话值随机消失/返回[重复]

    这个问题在这里已经有答案了 我们使用 Symfony 框架 V4 1 3 我们的会话值 看似 随机消失 重新出现 有时在几秒钟内它就消失 返回 有时它在几分钟后返回 消失 我们只是转储会话值 没有其他任何事情 到目前为止 它看起来是 100
  • 如何使用 ruby​​-on-rails 固定装置设置不属于 Rails 应用程序数据库的(外部)数据?

    根据我的要求 我创建了用于查询某些数据的外部数据库 与 Rails 应用程序使用的数据库不同 的模型 我正在尝试围绕这些模型编写测试 并希望将 样本测试数据 与实际测试分开 我以为我可以将数据放入 yml 文件并将其加载到哈希中 但它确实有
  • 给定一本字典和一个字母列表,找到可以用这些字母构建的所有有效单词

    暴力方式可以在 O n 内解决问题 基本上计算所有排列并在字典中检查结果 我正在寻找提高复杂性的方法 我可以考虑用字典构建一棵树 但仍然检查所有字母排列的时间复杂度为 O n 有更好的方法来解决这个问题吗 信件可以有重复项 该函数的 api
  • 通过代码在 Outlook 中发送/接收

    如果我使用 Excel VBA 创建 Outlook 2010 对象 Sub CreateOL On Error Resume Next Set myOlApp GetObject Outlook Application If Err Nu
  • 由于 .getContext() 未实现,单元测试引发错误

    我正在使用 Jest 为使用画布元素的组件编写测试 当我运行如下所示的测试时 我不断收到错误 Error Not implemented HTMLCanvasElement prototype getContext without inst
  • 将 System.out.println 记录到单个应用程序的日志文件

    我们在 tomcat 上有多个应用程序 它们使用 System out println 语句记录到 catalina out 有一个应用程序会创建大量日志语句 因此我想将这些应用程序输出记录到单独的日志文件中 我创建了一个 log4j xm
  • GridLayout 列宽

    我的目录中有 2 列GridLayout 我想要做的是让这些列各自占据屏幕宽度的一半 然后让它的子内容填充它们自己的单元格宽度 高度 我尝试让孩子们fill parent但这只会导致第一个占据整个布局 而且 GridLayout 似乎不支持
  • Ruby 类方法与特征类中的方法

    类方法和该类的特征类 或元类 中的方法只是定义一件事的两种方法吗 否则的话 有什么区别呢 class X class method def self a a end eigenclass method class lt lt self de
  • 我应该使用新的 HTML5 语义元素吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在升级我的网站 这涉及到使用新的 HTML5 语义元素的决定
  • 使用PHP和Javascript通过CORS实现站点之间的跨域通信

    经过几天的网络浏览并尝试了所有可能的方法后 我开始意识到我的主机服务器存在问题 它被我的主机服务器禁用 所以 我想把我的代码发布到 Stackoverflow 上 这样 SO 上的其他人就不会像我一样浪费时间了 该代码片段在 IE Safa
  • linux下获取硬盘剩余空间

    在 bash 脚本中 我需要获取总磁盘大小和整个磁盘当前使用的大小 我知道我可以使用以下命令获取总磁盘大小 而无需成为 root 用户 cat sys block sda size 该命令将输出设备 SDA 上的块数 将其乘以 512 您将
  • iOS——是否可以强制 UILabel 子类对象成为第一响应者?

    有什么办法可以做到这一点吗 我尝试将以下内容放入子类中 BOOL canBecomeFirstResponder return YES 但是当我向对象发送成为FirstResponder消息时 它仍然没有成为第一响应者 对的 这是可能的 你
  • 使用初始值设定项列表创建单项向量

    我有一个函数func这是超载采取任一std vector
  • MaterialDatePicker 仅选择 2 个日期之间的日期

    如何向 MaterialDatePicker 添加约束以强制用户仅选择 2 个日期之间的日期 val constraintBuilder CalendarConstraints Builder val materialRangeBuilde
  • 命令 test -x 在 ubuntu 中做什么?

    什么是test x从 etc cron daily logrotate 做什么 test x usr sbin logrotate exit 0 usr sbin logrotate etc logrotate conf 它是否测试是否已经
  • 如何加快 Julia 脚本的启动时间

    我编写了一个脚本来在 Julia 中绘制每日数据 但我发现它运行缓慢 似乎没有理想的方法来加速它 例如 foo jl bin bash exec julia O0 compile min BASH SOURCE 0 using Unicod
  • 异步 bash 脚本

    我见过一些例子 但无法将它们应用于我的情况 我有一个调用长时间运行的命令的脚本 但我想定期 例如每 1 秒 获取该调用的状态 例如 bin bash curl localhost 9200 my index forcemerge max n
  • FromBody不绑定字符串参数

    我有一个类似的问题ASP NET MVC 4 RC Web API 参数绑定问题 https stackoverflow com questions 11158617 asp net mvc 4 rc web api parameter b
  • 在 Windows 上从 C++ 调用 R 函数

    我正在尝试在 Windows 上从 C 调用 R 函数 我正在使用 MinGW 来编译程序 但它在编译时抛出错误 代码 取自Dirk 和编译错误如下 include
  • Flutter:热重载后应用程序不断返回初始路线

    我刚刚按照迁移指南将 FireBase 插件升级到最新版本https firebase flutter dev docs migration https firebase flutter dev docs migration并开始注意到 每