Flutter 如何在flatter中的几个类之间使用提供程序?

Flutter 如何在flatter中的几个类之间使用提供程序?,flutter,Flutter,我在Flatter中创建了一个注册应用程序,但是有太多的信息需要使用单个屏幕,所以我决定在屏幕中使用选项卡视图,并在抽屉的对象中分离屏幕 但是我需要使用来自不同屏幕的信息来保存它。所以我考虑使用多供应商。但当我尝试使用提供者中的信息时,它会抛出: Could not find the correct Provider<General> above this Baseformularios Widget 在此Baseformularios小部件上方找不到正确的提供程序 我的实现是这

我在Flatter中创建了一个注册应用程序,但是有太多的信息需要使用单个屏幕,所以我决定在屏幕中使用选项卡视图,并在抽屉的对象中分离屏幕

但是我需要使用来自不同屏幕的信息来保存它。所以我考虑使用多供应商。但当我尝试使用提供者中的信息时,它会抛出:

Could not find the correct Provider<General> above this Baseformularios Widget
在此Baseformularios小部件上方找不到正确的提供程序
我的实现是这样的:

这是我的抽屉,第一个字段是General,这是关于客户的基本信息, 正如您所看到的,提供者是在这里创建的,body:由一个名为bodycontent的变量提供的,当尝试更改表单时,该变量将被重写,但当我尝试打印用户名称时,它会抛出上面的错误

MultiProvider(
      providers: [
        ChangeNotifierProvider<General>(
          create: (context)=>General(),
        )
      ],
      child: Scaffold(
        appBar: AppBar(
          title: Text("Historias clinicas"),
          centerTitle: true,
          actions: <Widget>[
            IconButton(
              icon: Icon(Icons.check),
              onPressed: (){
                print(Provider.of<General>(context).nombre);
              Provider.of<General>(context).addCLiente();
              },
            )
          ],
        ),
        body: bodycontent,
        drawer: Drawer(
          child: ListView(
            padding: EdgeInsets.zero,
            children: <Widget>[
              AspectRatio(
                aspectRatio: 0.001/0.001,
                child:  DrawerHeader(
                  decoration: BoxDecoration(
                    gradient: LinearGradient(colors: [Colors.white,Colors.blueAccent]
                  ),
                ),
              ),

              ListTile(
                title: Text("General"),
                onTap: (){
                  setState(() {
                    bodycontent = I_II_III_IV();
                  });
                  Navigator.pop(context);
                },
              ),
            ],
          ),
        ),
      ),
    );
MultiProvider(
供应商:[
变更通知提供者(
create:(context)=>General(),
)
],
孩子:脚手架(
appBar:appBar(
标题:文本(“Historias clinicas”),
标题:对,
行动:[
图标按钮(
图标:图标(图标。检查),
已按下:(){
打印(提供(上下文).nombre);
Provider.of(context.addCLiente();
},
)
],
),
body:bodycontent,
抽屉(
子:ListView(
填充:EdgeInsets.zero,
儿童:[
AspectRatio(
方面:0.001/0.001,
儿童:抽屉阅读器(
装饰:盒子装饰(
渐变:LinearGradient(颜色:[颜色.白色,颜色.蓝色口音]
),
),
),
列表砖(
标题:正文(“总则”),
onTap:(){
设置状态(){
bodycontent=I_II_III_IV();
});
Navigator.pop(上下文);
},
),
],
),
),
),
);
以下是通用表格上的用法:

Provider.of<General>(context).set(nombre.text,
        "Apellido hay que quitar en la funcion",
        edad.text,
        _currentsexo,
        estado_civil.text,
        direccion.text,
        emergencia.text,
        procedencia.text,
        telefono.text,
        ocupacion.text,
        referencia.text,
        fecha_inicio.text,
        "",userid);
Provider.of(context.set)(nombre.text,
“在功能方面,我们可以做些什么”,
edad.text,
_当前的SEXO,
estado_civil.text,
direccion.text,
文本,
procedencia.text,
telefono.text,
ocupacion.text,
参考文本,
fecha_inicio.text,
“”,userid);
这很好地保存了信息,我在调试器中检查了它,但问题在另一边

在使用抽屉之前,我尝试在屏幕中使用multiprovider,但它抛出了相同的错误,但使用了“高于一般形式”。请注意,在尝试此操作时,我已将multiprovider从带有抽屉的屏幕中移除


那么,我应该在每个屏幕中声明multiprovider以将其用于其子屏幕吗?因为我假设提供者在声明后的每个屏幕中都可以使用变量,还是我误解了什么?…非常感谢您提供的所有帮助,感谢您的帮助。

从y的每个地方访问该提供者我们的应用程序,您应该在主应用程序中声明:

void main()  {
  runApp(MultiProvider(
    providers: [
      ChangeNotifierProvider<General>(
        create: (context) => General(),
      ),
    ],
    child: MyApp(),
  ));
}
void main(){
runApp(多供应商)(
供应商:[
变更通知提供者(
create:(context)=>General(),
),
],
子项:MyApp(),
));
}

您是否尝试过状态管理解决方案,如ScopedModel?它将允许您在应用程序中共享数据。@Joãosares实际上我以前没有听说过,我会看一看,谢谢您必须在祖先中注册提供程序widget@Yann39在每个小部件中?这取决于您是否需要访问单个小部件中的提供程序值widget,那么最佳实践是仅使用
ChangeNotifierProvider
包装此widget,因为它将向其所有子体提供
ChangeNotifier
类的实例(当您调用
Provider.of(BuildContext)时)
它将从与
上下文关联的小部件开始,沿着小部件树向下移动
)。如果您需要应用程序中任何位置的公开值,请将提供程序声明为主应用程序的祖先。在您的情况下,如果您无法获取提供程序的上下文后代,您也可以使用
消费者
。但是函数main没有上下文可用于提供程序更新的答案。但是您从何处获取上下文?是吗你试过了吗?它很有效,我在很多应用程序中都有这个实现,上下文来自主应用程序,请尝试一下。我在上次尝试时纠正了一些我做错的事情…它完全有效,非常棒,但作为最后一件事,为什么会这样?