Flutter 使用提供程序登录

Flutter 使用提供程序登录,flutter,dart,Flutter,Dart,我正在尝试使用提供者模式创建登录。这就是我到目前为止所尝试的 首先,这是我的用户存储库: enum Status { Uninitialized, Authenticated, Authenticating, Unauthenticated } class UserRepository with ChangeNotifier{ User user; Status _status =Status.Uninitialized; Status get status => _stat

我正在尝试使用提供者模式创建登录。这就是我到目前为止所尝试的

首先,这是我的用户存储库:

enum Status { Uninitialized, Authenticated, Authenticating, Unauthenticated }
class UserRepository with ChangeNotifier{
  User user;
  Status _status =Status.Uninitialized;

  Status get status => _status;
  User get authUser => user;

  Future<bool> signIn(String email, String password) async {
    try{
    var body = jsonEncode({
      'email': email,
      'password': password
    });

    var res = await http.post(('http://192.168.178.35:8000/auth/login'),
        body: body,
        headers: {
          "Accept": "application/json",
          "content-type": "application/json"
        });
    var response = jsonDecode(res.body);

    if(response.status == 200)
    {
      notifyListeners();
      return true;
    }
    }
    catch(e)
    {
      _status = Status.Unauthenticated;
      notifyListeners();
      return false;
    }
  }
}
enum状态{未初始化、已验证、正在验证、未验证}
使用ChangeNotifier初始化UserRepository{
用户;
状态_Status=Status.Uninitialized;
状态获取状态=>\u状态;
用户获取authUser=>User;
未来登录(字符串电子邮件、字符串密码)异步{
试一试{
var body=jsonEncode({
“电子邮件”:电子邮件,
“密码”:密码
});
var res=wait http.post(('http://192.168.178.35:8000/auth/login'),
身体:身体,,
标题:{
“接受”:“应用程序/json”,
“内容类型”:“应用程序/json”
});
var响应=jsonDecode(res.body);
如果(response.status==200)
{
notifyListeners();
返回true;
}
}
捕获(e)
{
_状态=状态。未经验证;
notifyListeners();
返回false;
}
}
}
这应该是我的进入页面(主页):

类主页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider(
儿童:消费者(
生成器:(上下文,用户存储库用户,u41;{
开关(用户状态){
案例状态。未初始化:
返回登录名();
案例状态。未经验证:
案例状态。验证:
返回登录名();
案例状态。已验证:
返回驱动仪表板(用户:user.user);
}
},
),
);
}
}
在我尝试运行应用程序后,出现以下错误:

有人知道为什么会这样吗?如何实现
ChangeNotifierProvider
,这种方法正确吗

我正在努力学习这个教程


但是,除了Firebase之外,我使用自定义创建的RESTful API作为后端。

尽管此错误消息并不直观,但我猜您可能会在
生成器
函数中返回一个
null

类主页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider(
儿童:消费者(
生成器:(上下文,用户存储库用户,u41;{
//注意:如果您的用户为null,该怎么办?
开关(用户状态){
案例状态。未初始化:
返回登录名();
案例状态。未经验证:
案例状态。验证:
返回登录名();
案例状态。已验证:
返回驱动仪表板(用户:user.user);
}
//返回pagehere();
},
),
);
}
}
您应该为构建器提供一个启动页或返回
小部件的内容

编辑: 下面是使用
ChangeNotifierProvider

ChangeNotifierProvider(
生成器:()=>AppState(),
子:MyHomePage(),
));
这是你在媒体上发布的代码:

@覆盖
小部件构建(构建上下文){
返回ChangeNotifierProvider(
生成器:(\u)=>UserRepository.instance(),
儿童:消费者(
生成器:(上下文,用户存储库用户,u41;{
开关(用户状态){
案例状态。未初始化:
返回飞溅();
案例状态。未经验证:
案例状态。验证:
返回登录页面();
案例状态。已验证:
返回UserInfoPage(用户:user.user);
}
},
),
);
}

ChangeNotifierProvider
应该包含一个
builder
child
,这就是为什么您的用户总是有
null

但我的用户总是null。。。我试图从UserRepository中的响应设置它,但不知何故它总是空的:(所以我的意思是,你应该返回一个页面,以防止在生成器函数中返回
null
。就像
user==null
那样,然后返回这样一个页面。我的目标不是解决你的代码逻辑,而是错误。现在我知道了,你只需要仔细看看你发布的教程。它会转到仪表板,但用户仍然是
null
。我尝试了d将其添加到
signIn
函数中,如
this.user=user.fromJson(json.decode(res.body));
但没有成功…您可以添加断点以查看在调试模式下发生的情况。它可能无法解码,并且用户始终为空。我认为您应该了解更多有关调试的信息,以解决这些问题。
class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<UserRepository>(     
    child: Consumer(
        builder: (context, UserRepository user, _) {
          switch (user.status) {
            case Status.Uninitialized:
              return Login();
            case Status.Unauthenticated:
            case Status.Authenticating:
              return Login();
            case Status.Authenticated:
              return DriverDashboard(user: user.user);
          }
        },
      ),
    );
  }
}