我有一个带有状态子级的 TabBarView ,每次选项卡更改时,子级窗口小部件都会重新初始化,并且其所有变量都将重置。
该子级基本上是一个自定义窗口小部件,它使用Future从 HTTP 请求中加载数据。完成后,我想缓存响应,以便当用户返回到选项卡时,它不必再次通过 HTTP 加载数据。但是,如果我将 HTTP 数据存储在有状态的小部件中,则在选项卡更改时,它会重新初始化为null(因此我必须再次加载它)。
如何防止flutter重新初始化标签内容小部件?
答案 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");
}
}