首页 文章

颤振 - 当状态发生变化时,如何防止变量重新初始化?

提问于
浏览
0

我有一个有状态子项的 TabBarView ,每次选项卡更改时,子窗口小部件都会重新初始化并重置所有变量 .

子节点基本上是一个自定义小部件,它使用Future来加载来自 HTTP 请求的数据 . 当它想要缓存响应时,当用户返回选项卡时,它不必再次通过 HTTP 加载数据 . 但是,如果我将 HTTP 数据存储在有状态窗口小部件中,则当选项卡更改时,它会重新初始化为null(因此我必须再次加载它) .

如何防止颤动重新初始化我的标签内容小部件?

1 回答

  • 0

    您可以创建 Future ,它从父级别的HTTP加载数据(一级到TabBarView)并将其发送到 TabBarView . 所以,每个标签上的 will not load 都会改变 .

    Small code example:

    import 'dart:async';
    
    import 'package:flutter/material.dart';
    
    void main() {
      runApp(TabBarDemo());
    }
    
    class TabBarDemo extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        Future<int> data = dataFromNetwork();
        return MaterialApp(
          home: DefaultTabController(
            length: 3,
            child: Scaffold(
              appBar: AppBar(
                bottom: TabBar(
                  tabs: [
                    Tab(icon: Icon(Icons.directions_car)),
                    Tab(icon: Icon(Icons.directions_transit)),
                  ],
                ),
                title: Text('Tabs Demo'),
              ),
              body: TabBarView(
                children: [
                  new Page(data), // I am sending the same data for example purpose
                  new Page(data),
                ],
              ),
            ),
          ),
        );
      }
    
      Future<int> dataFromNetwork() {
        return Future.delayed(Duration(seconds: 5), () {return 1;});
      }
    
    }
    
    class Page extends StatefulWidget {
      final Future<int> data;
    
      Page(this.data);
    
      @override
      State<StatefulWidget> createState() {
        return PageState(data);
      }
    }
    
    class PageState extends State<Page> {
      Future<int> data;
    
      PageState(this.data);
    
      @override
      Widget build(BuildContext context) {
        data.then((value) {
          print(value);
        });
        return Text("hi");
      }
    
    }
    

相关问题