Flutter-当状态改变时,如何防止变量被初始化?

时间:2018-09-03 06:17:09

标签: variables dart flutter

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

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

如何防止flutter重新初始化标签内容小部件?

1 个答案:

答案 0 :(得分:0)

您可以创建Future来从HTTP父级(直到TabBarView的一级)中加载数据并将其发送到TabBarView。因此,它不会在每次标签更改时不会加载

小代码示例:

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");
  }

}