我有一个有状态子项的 TabBarView ,每次选项卡更改时,子窗口小部件都会重新初始化并重置所有变量 .
子节点基本上是一个自定义小部件,它使用Future来加载来自 HTTP 请求的数据 . 当它想要缓存响应时,当用户返回选项卡时,它不必再次通过 HTTP 加载数据 . 但是,如果我将 HTTP 数据存储在有状态窗口小部件中,则当选项卡更改时,它会重新初始化为null(因此我必须再次加载它) .
如何防止颤动重新初始化我的标签内容小部件?
您可以创建 Future ,它从父级别的HTTP加载数据(一级到TabBarView)并将其发送到 TabBarView . 所以,每个标签上的 will not load 都会改变 .
Future
TabBarView
Small code example:
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"); } }
1 回答
您可以创建
Future
,它从父级别的HTTP加载数据(一级到TabBarView)并将其发送到TabBarView
. 所以,每个标签上的 will not load 都会改变 .Small code example: