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