【问题标题】:How to switch between Auth screen and Home screen based on bool value?如何根据布尔值在身份验证屏幕和主屏幕之间切换?
【发布时间】:2020-12-07 15:31:03
【问题描述】:

我想根据下面模型类中的布尔值(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 的更改后没有被重建

【问题讨论】:

  • 您可能希望使用 streamProvider 而不是 changenotifierprovider。看看这个:youtube.com/watch?v=j_SJ7XmT2MM。不要忘记点击描述中的github链接。
  • 是的,我按照教程进行操作,但是如何为上面的类构建流提供程序,我尝试流式传输 bool 值但它给出错误(bool 值无法流式传输),以及更改通知程序有误。
  • 通过使用流,您正在监听 bool 值的任何变化。只有当你告诉它这样做时,changednotifier 才会通知 bool 已更改。简而言之,您必须手动告诉 changednotifier 通知 bool 值已更改。
  • 好的,但是在围绕 bool User.status 构建流时出现错误。
  • 让你的包装器有状态,它会监听布尔值但不能重建,因为它没有状态。应该工作。

标签: flutter dart provider flutter-change-notifier


【解决方案1】:

这是我使用 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()。希望大家能理解,欢迎评论

【讨论】:

    猜你喜欢
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多