flutter 关于setState在build函数中使用引发死循环问题,怎么处理?

场景:在文章详情页中,通过get.arguments获取文章id参数,通过provider获取当前用户的userId参数。
通过id和userId请求文章详情接口,将获取的数据通过setState赋值给文章model。

因为setSate将触发build函数运行,而build函数中因为接口请求又将导致setState被运行,这样一直死循环,怎么解决?

@override
  Widget build(BuildContext context) {

    int id = Get.arguments['id'];
    UserModel userStore = Provider.of<UserModel>(context);

    ActivityApi.dynamicInfo(id,userStore.userId).then((res){
      setState(() {
        activity = Activity.fromJson(res.data);
      });
    });

    return Scaffold(
...
阅读 2.9k
3 个回答
  @override
  void initState() {
    Future.microtask(getData);
    super.initState();
  }

  void getData() {
    print('xxx --> ${ModalRoute.of(context)?.settings.arguments}');
  }

网络请求应该写在initState中。build函数只需保证数据可以正确渲染成widget即可。

我写过一篇文章介绍相关的基础知识,可以看一下:
《【开发经验】Flutter组件的事件传递与数据控制》https://segmentfault.com/a/11...

或许可以使用FutureBuilder

FutureBuilder(
   future: ActivityApi.dynamicInfo(id,userStore.userId),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          activity = Activity.fromJson(snapshot.data。data);      
        }else{
        }
    })
        
推荐问题
宣传栏