2

我想根据下面模型类中的 bool 值(user.status)在登录屏幕和主屏幕之间切换

class User extends ChangeNotifier {
  int phoneNumber;
  bool status = false;
  notifyListeners();
}

bool User.status 值是从下面的函数翻转的

User _user = Provider.of<User>(context);
...
...
if (form.validate()) {

      _user.status = true;
}

下面的函数必须监听来自 User 模型的状态值的变化并将屏幕更改为 Home()。

class Wrapper extends StatelessWidget {
@override
  Widget build(BuildContext context) {
    User authStatus = Provider.of<User>(context);
    return authStatus.status ? Home() : Auth();
  }
}

我没有任何错误,所有的值都在相应地更新,但是 Wrapper() 在听取了来自 ChangeNotifier 的更改后没有被重建

4

1 回答 1

0

这是我使用 Provider 的方法:

routes: {
  "/": (context) => MainPage(),
  "/detail": (context) => UserDetailPage(),
},
builder: (context, child) {
  return Consumer<UsersProvider>(
    child: child,
    builder: (context, provider, child) {

      final value = provider.user;
      if (!value.status) {
        return Navigator(
          onGenerateRoute: (settings) => MaterialPageRoute(
              settings: settings, builder: (context) => LoginPage()),
        );
      }

      return MultiProvider(
        providers: [
          ChangeNotifierProvider(create: (context) => UsersProvider()),
          ChangeNotifierProvider(
              create: (context) => InvoicesProvider()),
          ChangeNotifierProvider(create: (context) => EventsProvider()),
        ],
        child: child,
      );
    },
  );
},

基本上在 main.dart 中使用 builder 并定义路由,然后在 builder 内部使用 Consumer 是初始路由MainPage(),因此如果用户已经登录,他们将去那里,如果没有,基于状态他们将重定向到LoginPage(). 我希望你能理解随时发表评论

于 2020-08-19T02:58:15.840 回答