1

亲爱的,

我正在使用提供者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(),
                    },
                  );
                },
              );
            },
          ),
        );
      }
    }

请注意以下事项:

These are are paths static const strings
LoginScreen.path = "login"
RegisterScreen.path = "/register-screen"
HomeOneScreen.path = "home-one-screen"
HomeTwoScreen.path = "home-two-screen"
RegisterPhoneScreen.path = "/register-phone-screen"
VerifyPhoneScreen.path = "/verify-phone-screen"

我缺少动态的东西initialRoute工作?

非常感谢

4

1 回答 1

9

根据github issues上描述的这个问题,不允许进行初始路由更改。至少这是我所理解的。但是我所做的是我用attr替换了initialRoute属性。home因此,此更改要求initialScreen成为小部件 var。

更改如下所示:

 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(),
                    },
                  );
                },
              );
            },
          ),
        );
      }
    }

另请注意我的 RegistrationScreen 关于我所做的成功 api 响应Navigator.of(context).pop()

谢谢

于 2019-07-28T23:16:47.253 回答