flutter - 寻找提供者上下文的颤振问题
问题描述
我对 Flutter Provider 模式有疑问。将用户重定向到新屏幕后,找不到提供程序。
根据我之前的问题(在此小部件上方找不到正确的提供者),我编写了以下代码:
class NewRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
final title = 'Tap to select';
return MaterialApp(
title: title,
home: Scaffold(
appBar: AppBar(
title: Text(title),
),
body: NewRouteBody()
));
}
}
class NewRouteBody extends StatelessWidget {
@override
Widget build(BuildContext context) {
var user = Provider.of<UserRepository>(context);
return ListView(...)
我做了同样的事情,但我再次收到错误消息,指出它无法在此小部件 ( NewRouteBody
) 上方找到正确的提供程序。
试图以某种方式修复它,谷歌搜索了几个小时的答案,但没有成功......
任何帮助表示赞赏。
编辑
这是UserRepository
包含模式:
class UserRepository with ChangeNotifier {
User user;
Status _status = Status.Uninitialized;
Status get status => _status;
User get getUser => user;
...}
编辑2:
带有 ChangeNotifier 的代码片段:
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.red,
),
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<UserRepository>(
builder: (context) => UserRepository.instance(),
child: Consumer<UserRepository>(
builder: (context, UserRepository userRepository, _) {
switch (userRepository.status) {
case Status.Uninitialized:
return Login();
case Status.Unauthenticated:
return Login();
case Status.Authenticating:
case Status.Authenticated:
if(userRepository.getUser.isPrefSet == 0){
return Selection();
}
return Dashboard();
}
},
),
);
}
}
解决方案
问题是:
您ChangeNotifierProvider
位于Home内,但您正试图在Home外 访问它。
提供者是有范围的。这意味着如果它位于小部件树内,则只有其后代可以访问它。因此,在您的代码中,只有Home可以从提供程序读取。
要解决此问题,请将提供程序移到MaterialApp上方:
ChangeNotifierProvider<UserRepository> (
builder: (context) => UserRepository(),
child: MaterialApp(
home: Home(),
),
)
推荐阅读
- tensorflow - tensorflow.python.keras 和 tensorflow.keras 有什么区别?
- chatbase - 无法从控制台中删除不需要的平台
- java - 当我编译我的程序时,我得到 Error-SampleApplet.java 使用或覆盖已弃用的 API。并使用 -xlint:deprecation 重新编译以获取详细信息
- ios - Fabric 通知我 iOS 应用程序的“稳定性警报”,而应用程序运行良好且没有任何崩溃
- java - 无法在 Linux 服务器中执行 java 代码
- python - 在 Python 中存储多个二维数组
- java - 使用大小为 30K 的数组进行测试时,使用 HashMap 实现的代码失败
- machine-learning - LSTM 机器学习熊猫
- python - Django-rest-framework 如何验证 JSON 对象(不是 JSON 值)
- gradle - 如何解决 build.gradle 文件上的红十字覆盖?