Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 颤振-如何防止在状态更改时重新初始化变量?_Variables_Dart_Flutter - Fatal编程技术网

Variables 颤振-如何防止在状态更改时重新初始化变量?

Variables 颤振-如何防止在状态更改时重新初始化变量?,variables,dart,flutter,Variables,Dart,Flutter,我有一个带有有状态子项的选项卡视图,每次选项卡更改时,子小部件都会重新初始化,其所有变量都会重置 子组件基本上是一个自定义小部件,它使用Future从HTTP请求加载数据。完成后,我希望缓存响应,这样当用户返回选项卡时,就不必再次通过HTTP加载数据。但是,如果我将HTTP数据存储在有状态小部件中,当选项卡更改时,它会重新初始化为null(因此我必须再次加载它) 如何防止Flatter重新初始化我的tab内容小部件?您是否可以创建未来,在父级(TabBarView上一级)从HTTP加载数据,并将

我有一个带有有状态子项的选项卡视图,每次选项卡更改时,子小部件都会重新初始化,其所有变量都会重置

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


如何防止Flatter重新初始化我的tab内容小部件?

您是否可以创建
未来
,在父级(TabBarView上一级)从HTTP加载数据,并将其发送到
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");
  }

}
导入'dart:async';
进口“包装:颤振/材料.省道”;
void main(){
runApp(TabBarDemo());
}
类TabBarDemo扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
未来数据=dataFromNetwork();
返回材料PP(
主页:DefaultTabController(
长度:3,
孩子:脚手架(
appBar:appBar(
底部:选项卡栏(
选项卡:[
选项卡(图标:图标(图标方向车)),
选项卡(图标:图标(图标方向和交通)),
],
),
标题:文本(“选项卡演示”),
),
正文:选项卡视图(
儿童:[
新建页面(数据),//我正在发送相同的数据用于示例目的
新页面(数据),
],
),
),
),
);
}
未来数据源网络(){
returnfuture.delayed(持续时间(秒:5),(){return 1;});
}
}
类页面扩展StatefulWidget{
未来的最终数据;
第页(此页为数据);
@凌驾
状态createState(){
返回页面状态(数据);
}
}
类PageState扩展状态{
未来数据;
PageState(这个数据);
@凌驾
小部件构建(构建上下文){
数据。然后((值){
印刷品(价值);
});
返回文本(“hi”);
}
}

方法void initState()中的初始化变量{}我写了一篇文章: