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