【问题标题】:How to avoid reloading every time page and tabs flutter如何避免每次页面和选项卡抖动时都重新加载
【发布时间】:2023-02-25 17:40:12
【问题描述】:

我的问题是,当我进入应用程序的打开主页时,它将从 api 加载数据,我导航到其他页面,然后当我回到主页时,它再次加载数据。选项卡中的相同问题。我在一个页面中有 3 个选项卡,每次加载数据时,我只想加载一次数据,但是当数据库中的数据更新时,我想显示更改,这就是我使用流生成器创建列表的原因。

我正在使用流生成器。

以下是我的代码:

late Stream<AdminPostModel> stream = Stream.periodic(Duration(seconds: 3))
      .asyncMap((event) async => await getCurrentAdminPost());


  Future<AdminPostModel> getCurrentAdminPost() async {
    
    var url = "https:myURL.php?id=$getUserId&pageNo=$currentPage";
    var response = await http.get(Uri.parse(url));
    var jsondata = jsonDecode(response.body.toString());
   

    if (response.statusCode == 200) {
           return AdminPostModel.fromJson(jsondata);
      }
    else {
      return AdminPostModel.fromJson(jsondata);
    }
  }

用于制作数据列表:

               Expanded(
                    child: StreamBuilder<AdminPostModel>(
                  stream: stream,
                  builder: (context, snapshot) {
                    if (snapshot.hasData) {
                      return ....Code

【问题讨论】:

  • 我建议使用一些状态管理解决方案而不是直接的 streambuilder。这样你就可以在后台请求数据,只有当你有一些变化时才更新 UI。
  • 避免重新加载StreamBuilder,你可以用StreamBuilder包裹整个PageView并将数据传递到每个页面。

标签: flutter


【解决方案1】:

该功能称为坚持你的班级状态&实现你必须使用 wantKeepAlive

1) add  with AutomaticKeepAliveClientMixin after your State class

class ClassHome extends StatefulWidget{
@override
State<StatefulWidget> createState() => stateClassHome();

bool isPersistState;
ClassHome({required this.isPersistState});

}

class stateClassHome extends State<ClassHome> with AutomaticKeepAliveClientMixin {
  1. 覆盖 wantKeepAlive 变量

    @override
     // TODO: implement wantKeepAlive
     bool get wantKeepAlive => widget.isPersistState;
    
     @override
     void initState() {
     …
    
  2. 在您的构建上下文中写入此条件

    @覆盖 小部件构建(BuildContext 上下文){

       if (wantKeepAlive) {
         super.build(context);
       }
    
       return Scaffold(
         ….
    
  3. 现在在标签栏中你必须只设置 isPersistState 值,如果你设置为 true 那么你的数据将不会再次重新加载&在某些情况下,比如当我们必须处理实时数据然后将其设置为 false

    ClassDashboard(isPersistState: true,)
    

【讨论】:

    猜你喜欢
    • 2019-12-11
    • 2019-06-27
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 2021-10-19
    • 1970-01-01
    相关资源
    最近更新 更多