我正在尝试使用提供者模式创建登录名。这是我到目前为止尝试过的...
首先这是我的UserRepository:
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;
}
}
}
这应该是我的输入页面(主页):
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);
}
},
),
);
}
}
当我尝试运行该应用程序后,出现此错误:
有人知道为什么会这样吗?这是实现ChangeNotifierProvider
的正确方法吗?
我正在尝试遵循本教程https://medium.com/flutter-community/flutter-firebase-login-using-provider-package-54ee4e5083c7 ...
但是,除了Firebase之外,我使用自定义创建的RESTful API作为后端。
答案 0 :(得分:1)
尽管此错误消息不直观,但我想您可能会在null
函数中返回builder
。
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<UserRepository>(
child: Consumer(
builder: (context, UserRepository user, _) {
//NOTICE HERE: What If your user is null?
switch (user.status) {
case Status.Uninitialized:
return Login();
case Status.Unauthenticated:
case Status.Authenticating:
return Login();
case Status.Authenticated:
return DriverDashboard(user: user.user);
}
// return SplashPageHere();
},
),
);
}
}
您应该提供一个初始页面,或为构建器返回Widget
的内容。
编辑:
这是使用ChangeNotifierProvider
ChangeNotifierProvider<AppState>(
builder: (_) => AppState(),
child: MyHomePage(),
));
这是您从媒介发布的代码:
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
builder: (_) => UserRepository.instance(),
child: Consumer(
builder: (context, UserRepository user, _) {
switch (user.status) {
case Status.Uninitialized:
return Splash();
case Status.Unauthenticated:
case Status.Authenticating:
return LoginPage();
case Status.Authenticated:
return UserInfoPage(user: user.user);
}
},
),
);
}
ChangeNotifierProvider
应包含一个builder
和child
,这就是为什么您的用户始终拥有null
的原因...