尝试在 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<DocumentoProvider>
正在寻找错误的对象类型。
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的主要内容,如果未能解决你的问题,请参考以下文章