Flutter 为什么在使用提供程序调用api时出错?
我正在调用一个API并使用提供者保存它的响应,这样我就可以从我的Flatter应用程序的任何地方访问它。用于存储响应的模型是Flutter 为什么在使用提供程序调用api时出错?,flutter,dart,flutter-provider,Flutter,Dart,Flutter Provider,我正在调用一个API并使用提供者保存它的响应,这样我就可以从我的Flatter应用程序的任何地方访问它。用于存储响应的模型是 class Album with ChangeNotifier { final String id; final List<String> categoriesId; final String title; final String imageUrl; Album({this.id, this.ca
class Album with ChangeNotifier {
final String id;
final List<String> categoriesId;
final String title;
final String imageUrl;
Album({this.id, this.categoriesId, this.title, this.imageUrl});
factory Album.fromJson(Map<String, dynamic> json) {
List<dynamic> res = json['category_list'];
List<String> cats = [];
res.forEach((tx) {
cats.add(tx.toString());
});
return Album(
id: json['id'].toString(),
categoriesId: cats,
title: json['name'],
imageUrl: json["image"],
);
}
}
使用此提供程序的视图为
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
void initState() {
Provider.of<AlbumProvider>(context, listen: false).getPostData(context);
super.initState();
}
@override
Widget build(BuildContext context) {
List<Album> albumData = Provider.of<AlbumProvider>(context).allitems;
return Scaffold(
appBar: AppBar(
title: Text(
'Home Screen',
),
),
body:albumData.isEmpty
?Text("we are fetching data")
:Text("fetching complete")
)
}
}
类主页扩展StatefulWidget{
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState扩展状态{
void initState(){
Provider.of(context,listen:false).getPostData(context);
super.initState();
}
@凌驾
小部件构建(构建上下文){
List albumData=Provider.of(context).allitems;
返回脚手架(
appBar:appBar(
标题:正文(
“主屏幕”,
),
),
正文:albumData.isEmpty
?文本(“我们正在获取数据”)
:Text(“获取完成”)
)
}
}
当我运行应用程序时,出现以下错误:
为AlbumProvider发送通知时引发了以下断言:
在生成过程中调用setState()或markNeedsBuild()
无法将此_InheritedProviderScope小部件标记为需要构建,因为框架已在构建小部件的过程中。只有当一个小部件的祖先当前正在构建时,才可以将其标记为需要在构建阶段构建。此异常是允许的,因为框架在子部件之前构建父部件,这意味着将始终构建脏子部件。否则,框架可能不会在构建阶段访问此小部件。
调用setState()或markNeedsBuild()的小部件是:_InheritedProviderScope
出现错误的原因是什么?如何删除此错误?这是因为,当您呼叫时
Provider.of<AlbumProvider>(context, listen: false).getPostData(context);
此函数正在调用notifiyListeners();
问题是,您正在侦听对主页的内置方法的更改
List<Album> albumData = Provider.of<AlbumProvider>(context).allitems;
List albumData=Provider.of(context).allitems;
因此,最终,initState
调用的是getPostData
,调用的是notifyListeners()
,它将在小部件树完成构建之前尝试重新构建它
您应该
FutureBuilder
而不是在initState
方法中调用getPostData()
。allitems变量在哪里?
Provider.of<AlbumProvider>(context, listen: false).getPostData(context);
void getPostData(context) async {
bool loading = true;
if (this._items.isNotEmpty) {
this._items = await fetchAlbum(context);
}
loading = false;
notifyListeners();
}
List<Album> albumData = Provider.of<AlbumProvider>(context).allitems;