Flutter 颤振:在上下文不可用时使用changeNotifier和provider
我正在尝试使用flatter文档中描述的简单状态管理,使用ChangeNotifier、Consumer和ChangeNotifierProvider。 我的问题是,我无法获得有效的上下文来更新我的模型(详细信息如下…)。我得到一个错误: 错误:错误:在此CreateOrganizationDialog小部件上方找不到正确的提供程序 这可能是因为您使用的Flutter 颤振:在上下文不可用时使用changeNotifier和provider,flutter,Flutter,我正在尝试使用flatter文档中描述的简单状态管理,使用ChangeNotifier、Consumer和ChangeNotifierProvider。 我的问题是,我无法获得有效的上下文来更新我的模型(详细信息如下…)。我得到一个错误: 错误:错误:在此CreateOrganizationDialog小部件上方找不到正确的提供程序 这可能是因为您使用的BuildContext不包括您选择的提供者。有几个常见的场景: 您试图读取的提供程序位于不同的路径中 提供者是“有范围的”。因此,如果在路
BuildContext
不包括您选择的提供者。有几个常见的场景:
- 您试图读取的提供程序位于不同的路径中
- 您使用了一个
,它是您试图读取的提供程序的祖先BuildContext
class OrganizationModel extends ChangeNotifier {
final List<Organization> _items = [];
/// An unmodifiable view of the items in the cart.
UnmodifiableListView<Organization> get items => UnmodifiableListView(_items);
void addList(List<Organization> items) {
_items.addAll(items);
notifyListeners();
}
}
class OrganizationModel扩展了ChangeNotifier{
最终清单_项=[];
///购物车中项目的不可修改视图。
UnmodifiableListView get items=>UnmodifiableListView(\u items);
作废添加列表(列表项){
_items.addAll(items);
notifyListeners();
}
}
这是我的模型
class OrganizationBodyLayout extends StatelessWidget {
Future<void> _showCreateOrganizationDialog() async {
return showDialog<void>(
context: navigatorKey.currentState.overlay.context,
barrierDismissible: false,
child: CreateOrganizationDialog());
}
_onCreateOrganizationPressed() {
_showCreateOrganizationDialog();
}
_onDeleteOrganizationPressed() {
//TODO something
}
_onEditOrganizationPressed() {
//TODO something
}
@override
Widget build(BuildContext context) {
return Container(
child: Column(mainAxisSize: MainAxisSize.max, children: [
ButtonBar(
alignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
RaisedButton(
onPressed: _onCreateOrganizationPressed,
child: Text("New Organization"),
),
],
),
Expanded(
child: Container(
color: Colors.pink,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Expanded(
child: ChangeNotifierProvider(
create: (context) => OrganizationModel(),
child: OrganizationListView(),
)),
Expanded(child: Container(color: Colors.brown))
]))),
]));
}
}
class OrganizationBodyLayout扩展了无状态小部件{
Future\u showCreateOrganizationDialog()异步{
返回显示对话框(
上下文:navigatorKey.currentState.overlay.context,
禁止:错误,
子项:CreateOrganizationDialog());
}
_onCreateOrganizationPressed(){
_showCreateOrganizationDialog();
}
_onDeleteOrganizationPressed(){
//做点什么
}
_onEditOrganizationPressed(){
//做点什么
}
@凌驾
小部件构建(构建上下文){
返回容器(
子项:列(mainAxisSize:mainAxisSize.max,子项:[
钮扣杆(
对齐:MainAxisAlignment.start,
mainAxisSize:mainAxisSize.max,
儿童:[
升起的按钮(
onPressed:\u onCreateOrganizationPressed,
子:文本(“新组织”),
),
],
),
扩大(
子:容器(
颜色:颜色。粉红色,
孩子:排(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
扩大(
子项:ChangeNotifierProvider(
创建:(上下文)=>OrganizationModel(),
子项:OrganizationListView(),
)),
扩展(子:容器(颜色:Colors.brown))
]))),
]));
}
}
一个无状态小部件,在使用该模型的列表小部件的顶部包含一个ChangeNotifierProvider。
单击按钮,将显示一个模式对话框,然后从网络中获取数据。然后,我应该调用addList操作更新我的模型。
下面是有状态对话框的代码
class CreateOrganizationDialog extends StatefulWidget {
@override
_CreateOrganizationDialogState createState() =>
_CreateOrganizationDialogState();
}
class _CreateOrganizationDialogState extends State<CreateOrganizationDialog> {
TextEditingController _nametextController;
TextEditingController _descriptionTextController;
@override
initState() {
_nametextController = new TextEditingController();
_descriptionTextController = new TextEditingController();
super.initState();
}
@override
Widget build(BuildContext context) {
return Dialog(
child: Container(
width: 200,
height: 220,
child: Column(
children: [
Text('New organization',
style: Theme.of(context).textTheme.headline6),
Padding(
padding: EdgeInsets.all(8.0),
child: TextFormField(
decoration: new InputDecoration(hintText: "Organization name"),
controller: _nametextController,
),
),
Padding(
padding: EdgeInsets.all(8.0),
child: TextFormField(
decoration:
new InputDecoration(hintText: "Organization description"),
controller: _descriptionTextController,
),
),
ButtonBar(
children: [
FlatButton(
child: new Text("Cancel"),
onPressed: () {
Navigator.of(context).pop();
},
),
FlatButton(
child: new Text("Create"),
onPressed: () {
setState(() {
Future<Organization> organization =
backendCreateOrganization(_nametextController.text,
_descriptionTextController.text);
organization.then((value) {
Future<List<Organization>> organizations =
backendReloadOrganizations();
organizations.then((value) {
var model = context.read<OrganizationModel>();
// var model = navigatorKey.currentState.overlay.context.read<OrganizationModel>();
//model.addList(value);
});
});
});
Navigator.of(context).pop();
//context is the one for the create dialog here
},
)
],
)
],
),
));
}
}
class CreateOrganizationDialog扩展StatefulWidget{
@凌驾
_CreateOrganizationDialogState createState()=>
_CreateOrganizationDialogState();
}
类_CreateOrganizationDialogState扩展状态{
text编辑控制器_nametext控制器;
TextEditingController _descriptionTextController;
@凌驾
initState(){
_nametextController=新的TextEditingController();
_descriptionTextController=新建TextEditingController();
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回对话框(
子:容器(
宽度:200,
身高:220,
子:列(
儿童:[
文本('新组织',
风格:Theme.of(context.textTheme.headline6),
填充物(
填充:边缘设置。全部(8.0),
子项:TextFormField(
装饰:新输入装饰(hintText:“组织名称”),
控制器:_nametextController,
),
),
填充物(
填充:边缘设置。全部(8.0),
子项:TextFormField(
装饰:
新输入装饰(hintText:“组织描述”),
控制器:_descriptionTextController,
),
),
钮扣杆(
儿童:[
扁平按钮(
子项:新文本(“取消”),
已按下:(){
Navigator.of(context.pop();
},
),
扁平按钮(
子项:新文本(“创建”),
已按下:(){
设置状态(){
未来组织=
backendCreateOrganization(_nametextController.text,
_descriptionTextController.text);
组织。然后((值){
未来的组织=
backendReloadOrganizations();
组织。然后((值)
var model = context.read<OrganizationModel>();
var globalModel = OrganizationModel();
GetIt getIt = GetIt.instance;
getIt.registerSingleton<AppModel>(AppModelImplementation());
getIt.registerLazySingleton<RESTAPI>(() =>RestAPIImplementation());
var myAppModel = getIt.get<AppModel>();