伙计们,Flutter初学者在这里。我在应用程序中读取一个json开始与FutureProvider,但当我试图使用它来加载一个ListView,我得到的消息 "无法找到正确的Provider上面这个消费者",但它的声明和加载上面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(),
},
),
);
}
}
我的FutureProvider。
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);
}
}
而HomePage试图从我的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,
),
),
),
),
);
}
我只是看了很多教程,但我不能解决这个问题。
我想你的 Consumer<DocumentoProvider>
里面 HomePageState
正在寻找错误的对象类型。
您的供应商在 MyApp
正在提供两种类型。
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