flutter - 使用提供者登录
问题描述
我正在尝试使用提供者模式创建登录。这是我到目前为止尝试过的......
首先这是我的 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 作为后端。
解决方案
虽然,这个错误信息并不直观,但我猜你可能会null
在builder
函数中返回 a。
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
and child
,这就是为什么你总是null
为你的用户...
推荐阅读
- node.js - react-data-table-component 与嵌套表
- r - r- 将单词转换为数字
- java - 使用 .NET 创建一个复制 Java 代码的 Base 64 字节数组
- multithreading - 如何使用 x264 编码器库计算优化的并行运行编码作业数量
- entity-framework - 代码优先“启用迁移”脚手架不会从 SQL DB 捕获日期时间索引
- javascript - ionic 4中的自定义选项卡par我该怎么办
- python - 编译后的 Python 多进程退出且没有错误
- python - 网络驱动器的plpython3u路径问题
- elasticsearch - 在 Elasticsearch 6.3 中搜索时忽略 number_format_exception 等异常
- javascript - Google Apps 脚本:通过按钮以编程方式编辑仅查看 Google 表格的最有效方法?