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

Posted

技术标签:

【中文标题】尝试在 ListView 中使用其内容时未找到 Flutter FutureProvider【英文标题】:Flutter FutureProvider is not found when trying to use its contents in ListView 【发布时间】:2020-05-30 06:43:31 【问题描述】:

伙计们,这里是 Flutter 初学者。我在应用程序中读取一个以 FutureProvider 开头的 json,但是当我尝试使用它来加载 ListView 时,我收到消息“在此使用者上方找不到正确的提供程序”,但它已在 MaterialApp 上方声明和加载。我尝试使用 Consumer 和 Provider.of 但都不起作用。 一个细节:我想在路由中的所有页面之间共享 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(),
        ,
      ),
    );
  

我的未来提供者:

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

主页尝试从我的 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,
            ),
          ),
        ),
      ),
    );
  

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

【问题讨论】:

【参考方案1】:

我认为您在HomePageState 中的Consumer&lt;DocumentoProvider&gt; 正在寻找错误的对象类型。

MyApp 中的 Providers 提供两种类型:

Selecao List
        ChangeNotifierProvider(create: (context) => Selecao()),
        FutureProvider<List>(
          create: (_) async => DocumentoProvider().loadDocumentoData(),
          lazy: false,
        )

但在 HomePageState 中,您正在尝试使用 DocumentoProvider

 body: Container(
        child: Center(
          child: Consumer<DocumentoProvider>(

我认为应该是:

 body: Container(
        child: Center(
          child: Consumer<List>(

不相关旁注 - 我认为您不需要async

        FutureProvider<List>(
          create: (_) async => DocumentoProvider().loadDocumentoData(),

由于loadDocumentData() 被定义为DocumentoProvider 内部的异步函数

【讨论】:

以上是关于尝试在 ListView 中使用其内容时未找到 Flutter FutureProvider的主要内容,如果未能解决你的问题,请参考以下文章

作为服务运行时未找到 ODBC Lib

构建 .dll 时未找到 GCC 选项

使用getResources时未找到FileSystem异常

尝试连接时未找到 H2 驱动程序

删除 listView 时未更新总小时数

尝试使用 Python 3.6 安装 pyjinius 时未找到与 pyjinius 匹配的发行版