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

Jam*_*mad 7 android dart firebase flutter google-cloud-firestore

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

\n

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

\n

主程序.dart

\n
void main() async {\n  String authMethod;\n  WidgetsFlutterBinding.ensureInitialized();\n  SharedPreferenceService localStorage = SharedPreferenceService();\n  authMethod = await localStorage.getAuthMode();\n  print("Authentication Mode $authMethod");\n  setupLocator();\n\n\n  runApp(\n    DevicePreview(\n        enabled: false,//kReleaseMode,\n        builder: (context)=>AppInitialization())\n      );\n}\n
Run Code Online (Sandbox Code Playgroud)\n

应用程序初始化.dart

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

本地杂货在线.dart

\n
class LocalGroceryOnline extends StatelessWidget {\n  final GlobalKey<NavigatorState> navigatorKey = new GlobalKey<NavigatorState>();\n  @override\n  Widget build(BuildContext context) {    \n    return MultiProvider  (\n      providers: [\n        Provider<FirebaseAuthService>(create: (_) => FirebaseAuthService()),\n        Provider<SignInHelperService>(create: (_) => SignInHelperService()),\n        Provider<SharedPreferenceService>(create: (_) => SharedPreferenceService()),\n        ChangeNotifierProvider<CartModel>(create: (_) => CartModel()),\n        ChangeNotifierProvider<UserModel>(create: (_) => UserModel()),\n        ChangeNotifierProvider<ProductModel>(create: (_) => ProductModel()),\n        ChangeNotifierProvider<cat.Category>(create: (_) => cat.Category()),\n        ChangeNotifierProvider<AppSetting>(create: (_) => AppSetting()),\n        ChangeNotifierProvider<ValueNotifier<bool>>(create: (_) => ValueNotifier<bool>(false),),\n        ChangeNotifierProvider<ValueNotifier<int>>(create: (_) => ValueNotifier<int>(0),)\n\n      ],\n      child: MaterialApp(\n        debugShowCheckedModeBanner: false,\n        title: \'Online Local Grocery\',\n        locale: DevicePreview.of(context).locale,\n        builder: DevicePreview.appBuilder,\n        theme: ThemeData(\n          primaryColor: Colors.white,\n          fontFamily: \'Montserrat\',\n          appBarTheme: AppBarTheme(elevation: 0.0), //This is important\n\n        ),\n        initialRoute: AuthWidget.id,\n        navigatorKey: navigatorKey,\n\n        onGenerateRoute: RouteGenerator.generateRoute,\n        //onGenerateInitialRoutes: InitialRouteGenerator.generateRoute(),\n      )\n          ,\n    );\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

路线生成器.dart

\n
class RouteGenerator {\n  static Route<dynamic> generateRoute(RouteSettings settings) {\n    final args = settings.arguments;\n\n    switch (settings.name) {\n      case AuthWidget.id:\n        return MaterialPageRoute(builder: (_) => AuthWidget());\n\n      case SignUpSelectionScreen.id:\n        return MaterialPageRoute(builder: (_) => SignUpSelectionScreen());\n      case SignupForm.id:\n        return MaterialPageRoute(builder: (_) => SignupForm());\n      case LoginView.id:\n        return MaterialPageRoute(builder: (_) => LoginView());\n      case HomePage.id:\n        return MaterialPageRoute(builder: (_) => HomePage());\n      case MainPage.id:\n        if (args.runtimeType == MainCategory) {\n          return MaterialPageRoute(\n              builder: (_) => MainPage(\n                mainCategory: args,\n              ));\n        }\n        return _errorRoute();\n      case ProductDetail.id:\n        if (args.runtimeType == SelectedProductArguments) {\n          return MaterialPageRoute(\n              builder: (_) => ProductDetail(\n                    selectedProductArguments: args,\n                  ));\n        }\n        return _errorRoute();\n      case CheckOutScreen.id:\n        return MaterialPageRoute(builder: (_) => CheckOutScreen());\n      case Admin.id:\n        return MaterialPageRoute(builder: (_) => Admin());\n      case ScrapBoard.id:\n        return MaterialPageRoute(builder: (_) => ScrapBoard());\n      case ProductAdminView.id:\n        return MaterialPageRoute(builder: (_) => ProductAdminView());\n      case DeliveryAddressView.id:\n        return MaterialPageRoute(builder: (_) => DeliveryAddressView());\n      case PaymentView.id:\n        return MaterialPageRoute(builder: (_) => PaymentView());\n      case OrderProcessingView.id:\n        return MaterialPageRoute(builder: (_) => OrderProcessingView());\n      case MyOrdersView.id:\n        return MaterialPageRoute(builder: (_) => MyOrdersView());\n      case MyOrderDetails.id:\n        if (args.runtimeType == Order) {\n        return MaterialPageRoute(builder: (_) => MyOrderDetails(\n          order: args,\n        )\n         );\n        }\n        return _errorRoute();\n\n      default:\n        // If there is no such named route in the switch statement, e.g. /third\n        return _errorRoute();\n    }\n  }\n\n  static Route<dynamic> _errorRoute() {\n    return MaterialPageRoute(builder: (_) {\n      return Scaffold(\n        appBar: AppBar(\n          title: Text(\'Error\'),\n        ),\n        body: Center(\n          child: Text(\'ERROR\'),\n        ),\n      );\n    });\n  }\n}\n\nclass InitialRouteGenerator {\n  static Route<dynamic> generateRoute(RouteSettings settings) {\n    bool _firstTimeAppUsed;\n    final localStorage = new SharedPreferenceService();\n    localStorage.isFirstTimeAppUsed().then((bool value) {\n      if (value == true) {\n        _firstTimeAppUsed = true;\n      }\n    });\n    if (_firstTimeAppUsed) {\n      return MaterialPageRoute(builder: (_) => SignUpSelectionScreen());\n    }\n    return MaterialPageRoute(builder: (_) => HomePage());\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

AuthWidget.dart

\n
class AuthWidget extends StatelessWidget {\n  static const id = "auth_widget";\n\n  @override\n  Widget build(BuildContext context) {\n    print("Auth Widget...");\n    final authService =\n        Provider.of<FirebaseAuthService>(context, listen: false);\n    final userModel = Provider.of<UserModel>(context, listen: false);\n    final signInHelperService = Provider.of<SignInHelperService>(context, listen: false);\n\n    return StreamBuilder(\n        stream: authService.onAuthStateChanged,\n        builder: (context, snapshot) {\n          if (snapshot.connectionState == ConnectionState.active) {\n            print ("INSIDE AUTH WIDGET");\n            final user = snapshot.data;\n            if (user != null) {\n              print("${user.uid} ${user.userName} ${user.photoUrl}");\n              userModel.user = user;\n              return StreamBuilder(\n                  stream: FirebaseFirestore.instance\n                      .collection(\'users\')\n                      .doc(user.uid)\n                      .get().asStream(),\n                  builder: (context, userSnapshot) {\n                    if (userSnapshot.hasData && snapshot.connectionState == ConnectionState.active) {\n                      final userDocument = userSnapshot.data;\n                      if (userDocument != null) {\n                        print("------ Data Found -------");\n                        AppUser user = AppUser.fromMap(userDocument);\n                        //bool signUpComplete = userDocument["signUpComplete"];\n                        bool signUpComplete = user.signUpComplete;\n                        if (signUpComplete == null) signUpComplete = false;\n                        if (!signUpComplete) {\n                          print("userModel.user UID ${userModel.user.uid}");\n                          return SignupForm();\n                        } else {\n                          AppUser user2 = AppUser.fromMap(userDocument);\n                          userModel.user = user2;\n                          print(\'User Level ..... ${userModel.user.userLevel}\');\n                          signInHelperService.getAndUpdateDeviceToken(user2);\n\n                          return HomePage(); //MainPage();\n                        }\n                      }\n                    }\n                    return emptyScaffoldWithProgress();\n                  });\n            }\n            return SignUpSelectionScreen();\n          }\n          return emptyScaffoldWithProgress();\n        });\n  }\n\n  Scaffold emptyScaffoldWithProgress() {\n    return Scaffold(\n      body: Center(\n        child: SizedBox(\n          height: 90,\n          width: 90,\n          child: CircularProgressIndicator(\n              strokeWidth: 5.0,\n              valueColor: AlwaysStoppedAnimation<Color>(Colors.redAccent)),\n        ),\n      ),\n    );\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

扑动医生-v

\n
[\xe2\x88\x9a] Flutter (Channel stable, 1.22.4, on Microsoft Windows [Version 10.0.19041.630], locale en-US)\n    \xe2\x80\xa2 Flutter version 1.22.4 at C:\\src\\flutter\n    \xe2\x80\xa2 Framework revision 1aafb3a8b9 (3 weeks ago), 2020-11-13 09:59:28 -0800\n    \xe2\x80\xa2 Engine revision 2c956a31c0\n    \xe2\x80\xa2 Dart version 2.10.4\n\n\n[\xe2\x88\x9a] Android toolchain - develop for Android devices (Android SDK version 29.0.3)\n    \xe2\x80\xa2 Android SDK at C:\\Users\\Jamal\\AppData\\Local\\Android\\sdk\n    \xe2\x80\xa2 Platform android-29, build-tools 29.0.3\n    \xe2\x80\xa2 Java binary at: C:\\Android\\Android Studio\\jre\\bin\\java\n    \xe2\x80\xa2 Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)\n    \xe2\x80\xa2 All Android licenses accepted.\n\n[\xe2\x88\x9a] Android Studio (version 4.0)\n    \xe2\x80\xa2 Android Studio at C:\\Android\\Android Studio\n    \xe2\x80\xa2 Flutter plugin version 47.1.2\n    \xe2\x80\xa2 Dart plugin version 193.7361\n    \xe2\x80\xa2 Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)\n\n[\xe2\x88\x9a] VS Code (version 1.51.1)\n    \xe2\x80\xa2 VS Code at C:\\Users\\Jamal\\AppData\\Local\\Programs\\Microsoft VS Code\n    \xe2\x80\xa2 Flutter extension version 3.17.0\n\n[\xe2\x88\x9a] Connected device (1 available)\n    \xe2\x80\xa2 Android SDK built for x86 (mobile) \xe2\x80\xa2 emulator-5554 \xe2\x80\xa2 android-x86 \xe2\x80\xa2 Android 10 (API 29) (emulator)\n\n\xe2\x80\xa2 No issues found!\n
Run Code Online (Sandbox Code Playgroud)\n

Jam*_*mad 0

我找到了罪魁祸首,它是导致热重载DevicePreview执行的原因。runApp我不知道为什么现在工作正常。我现在已经把它删除了。