Flutter 颤振:在上下文不可用时使用changeNotifier和provider

Flutter 颤振:在上下文不可用时使用changeNotifier和provider,flutter,Flutter,我正在尝试使用flatter文档中描述的简单状态管理,使用ChangeNotifier、Consumer和ChangeNotifierProvider。 我的问题是,我无法获得有效的上下文来更新我的模型(详细信息如下…)。我得到一个错误: 错误:错误:在此CreateOrganizationDialog小部件上方找不到正确的提供程序 这可能是因为您使用的BuildContext不包括您选择的提供者。有几个常见的场景: 您试图读取的提供程序位于不同的路径中 提供者是“有范围的”。因此,如果在路

我正在尝试使用flatter文档中描述的简单状态管理,使用ChangeNotifier、Consumer和ChangeNotifierProvider。 我的问题是,我无法获得有效的上下文来更新我的模型(详细信息如下…)。我得到一个错误:

错误:错误:在此CreateOrganizationDialog小部件上方找不到正确的提供程序

这可能是因为您使用的
BuildContext
不包括您选择的提供者。有几个常见的场景:

  • 您试图读取的提供程序位于不同的路径中
提供者是“有范围的”。因此,如果在路由中插入一个提供程序,则其他路由将无法访问该提供程序

  • 您使用了一个
    BuildContext
    ,它是您试图读取的提供程序的祖先
确保CreateOrganizationDialog位于MultiProvider/Provider下。 这通常发生在创建提供者并尝试立即读取它时

以下是我的代码摘录:

    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>();