尝试在ListView中使用其内容时未找到Flatter FutureProvider

尝试在ListView中使用其内容时未找到Flatter FutureProvider,listview,flutter,async-await,future,provider,Listview,Flutter,Async Await,Future,Provider,伙计们,我是初学者。我正在用FutureProvider读取应用程序中的json,但当我尝试使用它加载ListView时,我收到消息“无法在该消费者上方找到正确的提供者”,但它在MaterialApp上方声明并加载。我尝试使用消费者和提供者,但两者都不起作用。 一个细节:我想在routes中的所有页面之间共享json内容 class MyApp extends StatelessWidget { @override Widget build(BuildContext context) {

伙计们,我是初学者。我正在用FutureProvider读取应用程序中的json,但当我尝试使用它加载ListView时,我收到消息“无法在该消费者上方找到正确的提供者”,但它在MaterialApp上方声明并加载。我尝试使用消费者和提供者,但两者都不起作用。 一个细节:我想在routes中的所有页面之间共享json内容

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (context) => Selecao()),
        FutureProvider<List>(
          create: (_) async => DocumentoProvider().loadDocumentoData(),
          lazy: false,
        )
      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        home: HomePage(), // route for home is '/' implicitly
        routes: <String, WidgetBuilder>{
          // define the routes
          ApresentacaoPage.routeName: (BuildContext context) =>
              ApresentacaoPage(),
          CatecismosPage.routeName: (BuildContext context) => CatecismosPage(),
          DocumentosPage.routeName: (BuildContext context) => DocumentosPage(),
          IndicePage.routeName: (BuildContext context) => IndicePage(),
          SobrePage.routeName: (BuildContext context) => SobrePage(),
          PesquisaPage.routeName: (BuildContext context) => PesquisaPage(),
          ConteudoPage.routeName: (BuildContext context) => ConteudoPage(),
        },
      ),
    );
  }
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
回程多供应商(
供应商:[
ChangeNotifierProvider(创建:(上下文)=>Selecao()),
未来供应商(
创建:(41; async=>documentProvider().loadDocumentoData(),
懒惰:错,
)
],
孩子:MaterialApp(
debugShowCheckedModeBanner:false,
home:HomePage(),//home的路由隐式为“/”
路线:{
//定义路线
ApresentacaoPage.routeName:(构建上下文)=>
ApresentacaoPage(),
CatecismosPage.routeName:(BuildContext上下文)=>CatecismosPage(),
DocumentosPage.routeName:(构建上下文)=>DocumentosPage(),
IndicatePage.routeName:(BuildContext上下文)=>IndicatePage(),
SoPrePage.routeName:(构建上下文)=>SoPrePage(),
PesquisaPage.routeName:(BuildContext上下文)=>PesquisaPage(),
ConteudoPage.routeName:(BuildContext上下文)=>ConteudoPage(),
},
),
);
}
}
我的未来提供者:

class DocumentoProvider with ChangeNotifier {
  final String _dataPath = "assets/data.json";
  List lista = new List();

  Future<List> loadDocumentoData() async {
    var dataString = await loadAsset();
    lista = json.decode(dataString);

    print('leu provider');
    // print(lista);
    // notifyListeners();
    return lista;
  }

  Future<String> loadAsset() async {
    return await rootBundle.loadString(_dataPath);
  }
}
class DocumentoProvider和ChangeNotifier{
最后一个字符串_dataPath=“assets/data.json”;
List lista=新列表();
将来的loadDocumentoData()异步{
var dataString=await loadAsset();
lista=json.decode(dataString);
打印(“leu提供程序”);
//印刷品(lista);
//notifyListeners();
返回列表a;
}
Future loadAsset()异步{
返回wait-rootBundle.loadString(_-dataPath);
}
}
以及试图从my futureprovider加载lista属性的主页:

class HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    // var documentos = Provider.of<DocumentoProvider>(context, listen: false);
    // var lista = documentos.lista;
    // print(lista);

    return Scaffold(
      appBar: AppBar(
        title: Text("CONFE"),
      ),
      drawer: Menu(),
      body: Container(
        child: Center(
          child: Consumer<DocumentoProvider>(
            builder: (context, documentos, child) => ListView.builder(
              key: ObjectKey(documentos.lista[0]),
              itemBuilder: (BuildContext context, int index) {
                return Card(
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: <Widget>[
                      titleSection(documentos.lista[index]),
                    ],
                  ),
                );
              },
              itemCount: documentos.lista == null ? 0 : documentos.lista.length,
            ),
          ),
        ),
      ),
    );
  }
类HomePageState扩展状态{
@凌驾
小部件构建(构建上下文){
//var documentos=Provider.of(上下文,侦听:false);
//var lista=documentos.lista;
//印刷品(lista);
返回脚手架(
appBar:appBar(
标题:文本(“CONFE”),
),
抽屉:菜单(),
主体:容器(
儿童:中心(
儿童:消费者(
生成器:(上下文、文档、子项)=>ListView.builder(
key:ObjectKey(documentos.lista[0]),
itemBuilder:(构建上下文,int索引){
回程卡(
子:列(
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
标题部分(documentos.lista[索引]),
],
),
);
},
itemCount:documentos.lista==null?0:documentos.lista.length,
),
),
),
),
);
}

我刚刚阅读并观看了很多教程,但我无法修复它。

我认为您的
消费者
主页状态中查找错误的对象类型

MyApp
中的提供商提供了两种类型:

  • Selecao
  • 列表
我认为这应该是:

 body: Container(
        child: Center(
          child: Consumer<List>(
因为
loadDocumentData()
定义为
documentProvider中的异步函数

 body: Container(
        child: Center(
          child: Consumer<DocumentoProvider>(
 body: Container(
        child: Center(
          child: Consumer<List>(
        FutureProvider<List>(
          create: (_) async => DocumentoProvider().loadDocumentoData(),