Flutter 组件技巧 刷新数据

发布时间 2023-11-16 17:57:07作者: 行走的泡泡鱼

1. 起因

因为组件在创建后,放入widget数之后,就会调用 initState,执行一次里面的内容。

我之前的项目里,

  • 有一个Stack,用来切换子页面,子页面有2级;
  • 在子页面的initState里,我去获取后端的数据,看中了initState只调用一次,达到我获取一次然后拿来显示的目的

这样出现一个问题:单个页面调试没有问题,但是整个程序一起来,十几,二十个页面一起去获取数据,会有一部分获取不到数据,然后导致显示异常(因为只获取一次)。

2. 解决方案

不知道会有多少种解决方案,我想到的方案如下:

2.1 集中加载

就是说在连接到后端的时候,找个时间全部同步一次,数据缓存起来,然后后续界面就直接从缓存里拿数据使用就好。

应该比较好理解,不过我暂时没用这种,所以没代码。

2.2 分步加载

希望当前页面加载当前页面自己需要的内容,不使用initState。

我把我的代码简化成下面的代码,我再页面切换的按钮里先调用方法来刷新数据,达到我的目的。

class HomePageState extends State<HomePage> {
  SubPageController _subPageController = SubPageController(); //在Home定义

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    SubPage(_subPageController));//传入子页面
  }
  ...
    onPressed: () {
      if(_subPageController.methodA!=null) {//调用
        _subPageController.methodA!();
      }
    }
  ...
}
class SubPageController{ //自己加的
  void Function() methodA;
}

class SubPage extends StatefulWidget {
  SubPage(this.subPageController,{super.key});

  final SubPageController subPageController;//接收传进来的

  @override
  State<SubPage> createState() => _SubPageState();
}

class _SubPageState extends State<SubPage> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    widget.subPageController.methodA = doMethod;
  }

  void doMethod()
  {
    print('调用');
  }
}