Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 为什么在使用提供程序调用api时出错?_Flutter_Dart_Flutter Provider - Fatal编程技术网

Flutter 为什么在使用提供程序调用api时出错?

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

我正在调用一个API并使用提供者保存它的响应,这样我就可以从我的Flatter应用程序的任何地方访问它。用于存储响应的模型是

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;