Flutter 颤振:动态初始路径

Flutter 颤振:动态初始路径,flutter,flutter-navigation,Flutter,Flutter Navigation,亲爱的 我正在使用dart包,它允许侦听器在模型本身发生更改时获得通知 我能够在我的主应用程序根目录树中检测到更改,也能够更改初始路由的字符串值,但是我的屏幕没有更新。请参见下面的代码段和注释行: void main() => runApp(_MyAppMain()); class _MyAppMain extends StatelessWidget { @override Widget build(BuildContext context) {

亲爱的

我正在使用dart包,它允许侦听器在模型本身发生更改时获得通知

我能够在我的主应用程序根目录树中检测到更改,也能够更改初始路由的字符串值,但是我的屏幕没有更新。请参见下面的代码段和注释行:

  void main() => runApp(_MyAppMain());

    class _MyAppMain extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MultiProvider(
          providers: [
            ChangeNotifierProvider<UserProvider>.value(
              value: UserProvider(),
            ),
            ChangeNotifierProvider<PhoneProvider>.value(
              value: PhoneProvider(),
            )
          ],
          child: Consumer<UserProvider>(
            builder: (BuildContext context, userProvider, _) {
              return FutureBuilder(
                future: userProvider.getUser(),
                builder: (BuildContext context, AsyncSnapshot<User> snapshot) {
                  if (!snapshot.hasData) {
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  }

                  final User user = snapshot.data;

                  String initialScreen = LoginScreen.path;

    // (1) I am able to get into the condition

                  if (user.hasActiveLogin()) {
                    initialScreen = HomeOneScreen.path;
                  }

                  return MaterialApp(
                    title: 'MyApp',
                    theme: ThemeData(
                      primarySwatch: Colors.green,
                      accentColor: Colors.blueGrey,
                    ),
                    initialRoute: initialScreen, 
 // (2) here the screen is not changing...?
                    routes: {
                      '/': (context) => null,
                      LoginScreen.path: (context) => LoginScreen(),
                      RegisterScreen.path: (context) => RegisterScreen(),
                      HomeOneScreen.path: (context) => HomeOneScreen(),
                      HomeTwoScreen.path: (context) => HomeTwoScreen(),
                      RegisterPhoneScreen.path: (context) => RegisterPhoneScreen(),
                      VerifyPhoneScreen.path: (context) => VerifyPhoneScreen(),
                    },
                  );
                },
              );
            },
          ),
        );
      }
    }
我在上班的路上错过了什么


非常感谢

根据上所述的问题,不允许进行初始路线更改。至少这是我所理解的。然而,我所做的是用home attr替换initialRoute属性。因此,此更改要求initialScreen成为一个小部件变量

变化如下所示:

 void main() => runApp(_MyAppMain());

    class _MyAppMain extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MultiProvider(
          providers: [
            ChangeNotifierProvider<UserProvider>.value(
              value: UserProvider(),
            ),
            ChangeNotifierProvider<PhoneProvider>.value(
              value: PhoneProvider(),
            )
          ],
          child: Consumer<UserProvider>(
            builder: (BuildContext context, userProvider, _) {
              return FutureBuilder(
                future: userProvider.getUser(),
                builder: (BuildContext context, AsyncSnapshot<User> snapshot) {
                  if (!snapshot.hasData) {
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  }

                  final User user = snapshot.data;

// (1) This becomes a widget

                  Widget initialScreen = LoginScreen();



                  if (user.hasActiveLogin()) {
                    initialScreen = HomeOneScreen();
                  }

                  return MaterialApp(
                    title: 'MyApp',
                    theme: ThemeData(
                      primarySwatch: Colors.green,
                      accentColor: Colors.blueGrey,
                    ),
                    home: initialScreen, 
 // (2) here the initial route becomes home attr.
                    routes: {
                      '/': (context) => null,
                      LoginScreen.path: (context) => LoginScreen(),
                      RegisterScreen.path: (context) => RegisterScreen(),
                      HomeOneScreen.path: (context) => HomeOneScreen(),
                      HomeTwoScreen.path: (context) => HomeTwoScreen(),
                      RegisterPhoneScreen.path: (context) => RegisterPhoneScreen(),
                      VerifyPhoneScreen.path: (context) => VerifyPhoneScreen(),
                    },
                  );
                },
              );
            },
          ),
        );
      }
    }
还请注意,在我的注册屏幕上,我在Navigator.ofcontext.pop上进行了成功api响应

谢谢

 void main() => runApp(_MyAppMain());

    class _MyAppMain extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MultiProvider(
          providers: [
            ChangeNotifierProvider<UserProvider>.value(
              value: UserProvider(),
            ),
            ChangeNotifierProvider<PhoneProvider>.value(
              value: PhoneProvider(),
            )
          ],
          child: Consumer<UserProvider>(
            builder: (BuildContext context, userProvider, _) {
              return FutureBuilder(
                future: userProvider.getUser(),
                builder: (BuildContext context, AsyncSnapshot<User> snapshot) {
                  if (!snapshot.hasData) {
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  }

                  final User user = snapshot.data;

// (1) This becomes a widget

                  Widget initialScreen = LoginScreen();



                  if (user.hasActiveLogin()) {
                    initialScreen = HomeOneScreen();
                  }

                  return MaterialApp(
                    title: 'MyApp',
                    theme: ThemeData(
                      primarySwatch: Colors.green,
                      accentColor: Colors.blueGrey,
                    ),
                    home: initialScreen, 
 // (2) here the initial route becomes home attr.
                    routes: {
                      '/': (context) => null,
                      LoginScreen.path: (context) => LoginScreen(),
                      RegisterScreen.path: (context) => RegisterScreen(),
                      HomeOneScreen.path: (context) => HomeOneScreen(),
                      HomeTwoScreen.path: (context) => HomeTwoScreen(),
                      RegisterPhoneScreen.path: (context) => RegisterPhoneScreen(),
                      VerifyPhoneScreen.path: (context) => VerifyPhoneScreen(),
                    },
                  );
                },
              );
            },
          ),
        );
      }
    }