Flutter 如何根据bool值在Auth屏幕和主屏幕之间切换?

Flutter 如何根据bool值在Auth屏幕和主屏幕之间切换?,flutter,dart,provider,flutter-change-notifier,Flutter,Dart,Provider,Flutter Change Notifier,我想根据下面模型类中的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()) {

我想根据下面模型类中的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\u User=Provider.of(上下文);
...
...
if(form.validate()){
_user.status=true;
}
下面的函数必须侦听用户模型中状态值的更改,并将屏幕更改为Home()

类包装扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
用户authStatus=Provider.of(上下文);
返回authStatus.status?Home():Auth();
}
}

我没有任何错误,所有的值都会相应地更新,但是在侦听ChangeNotifier的更改后,包装器()不会重新生成。下面是我如何使用提供程序执行此操作的:

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,
      );
    },
  );
},
路线:{
“/”:(上下文)=>MainPage(),
“/detail”:(上下文)=>UserDetailPage(),
},
生成器:(上下文,子对象){
退货消费者(
孩子:孩子,
生成器:(上下文、提供程序、子级){
最终值=provider.user;
如果(!value.status){
返回导航器(
onGenerateRoute:(设置)=>MaterialPage路由(
设置:设置,生成器:(上下文)=>LoginPage()),
);
}
回程多供应商(
供应商:[
ChangeNotifierProvider(创建:(上下文)=>UsersProvider()),
变更通知提供者(
create:(context)=>InvoicesProvider()),
ChangeNotifierProvider(创建:(上下文)=>EventsProvider()),
],
孩子:孩子,
);
},
);
},

基本上,在main.dart中使用builder并定义路由,然后在builder内部使用Consumer were-was-child是初始路由
MainPage()
,因此如果用户已经登录,他们将转到那里,如果没有登录,他们将根据状态重定向到
LoginPage()
。我希望您能理解,请随意评论

您希望使用streamProvider而不是changenotifierprovider。看看这个:。别忘了点击描述中的github链接。是的,我遵循了教程,但是如何为类似于上面的类构建流提供程序,我尝试流式传输bool值,但它给出了错误(bool值不能流式传输),以及更改通知程序的错误。通过使用流,您正在侦听布尔值中的任何更改。changednotifier只有在您告诉它这样做的情况下才会通知bool已更改。简而言之,您必须手动告诉changednotifier通知bool值已更改。好的,但我在围绕bool User.status构建流时遇到错误。使包装器有状态,它将侦听布尔值,但无法重建,因为它没有状态。应该有用。
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,
      );
    },
  );
},