flutter - 在自定义类颤振中使用提供者
问题描述
我正在创建一个需要使用 Provider 来获取值的程序。我在有状态的小部件中调用我的提供程序,如下所示
final user = Provider.of<Users>(context);
现在我想在自定义类中使用提供者
class UserInformation {
final user = Provider.of<Users>(context):
}
这不起作用,因为没有定义上下文。请协助我如何在不使用BuildContext
.
这是我在单独的 dart 文件中拥有的类用户,并用作我的数据流的模型。
class Users {
final String uid;
final String name;
final String department;
final String position;
Users({ this.uid, this.department, this.name, this.position });
}
这是我用来从 Firestore 中提取数据的查询
Stream<List<FormQuestions>> get userData{
return userCollection.where('name', isEqualTo: 'First Name').where('department', isEqualTo: 'department').snapshots()
.map(_userDataFromSnapshot);
}
我希望该名称是我从模型类中获得的变量(user.name)。部门也是如此。
谢谢。
解决方案
您只能访问ChangeNotifiers
位于此提供的树下方的后代小部件中的类,ChangeNotifier
因为在幕后Provider
使用InheritedWidget
(使用context
)为您提供您ChangeNotifier
在树中放置的
因此,在您的情况下,无法访问Users
from UserInformation
,您必须更改代码以解决问题
编辑:如果您在小部件中使用此代码,这是实现您想要的目标的建议:
class UserInformation{
final User user;
UserInformation(this.user);
}
class SomeWidget extends StatefulWidget {
@override
_SomeWidgetState createState() => _SomeWidgetState();
}
class _SomeWidgetState extends State<SomeWidget> {
void someMethod(){
final User user = Provider.of<Users>(context);
UserInformation userInformation = UserInformation(user);
//do something
}
@override
Widget build(BuildContext context) {
return Container();
}
}
推荐阅读
- antlr - 修改 ctx.removeLastChild/ctx.addChild 后,有没有办法从 antlr4ts 解析树中取回源代码?
- javascript - 在选择列表中的选定项目旁边添加输入文本
- c# - 限制 .net core 中的并发请求
- apache-spark-sql - 如何从以下架构中选择列“?
- c++ - 为什么向量化在这个 for 循环中没有好处?
- c++ - VS 2019(Visual Studio)Linux makefile 项目 - 从 Windows 编译时“没有这样的文件或目录”
- regex - 字符串的正则表达式,可以包含数字、字母或两者的组合。不要包含符号或特殊字符
- kubernetes - 谁能告诉我在执行 kubeadm upgrade apply 时如何避免升级 CoreDns?
- python-3.x - 无法导入 sublime_plugin
- onmouseover - 播放事件在 HTML 和 Javascript 中不起作用