我有一个非常简单的 Flutter 应用,它有一个 TabBarView 和两个 View (Tab 1 和 Tab 2),其中一个(Tab 1) 有一个带有许多简单文本小部件的 ListView,问题是在我向下滚动 Tab 1 的 ListView 元素后,如果我从 Tab 滑动1 到 Tab 2 最后我从 Tab 2到Tab 1,Tab 1的ListView中之前的滚动位置会丢失。
代码如下:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage>
with SingleTickerProviderStateMixin {
late TabController controller;
@override
void initState() {
super.initState();
controller = TabController(
length: 2,
vsync: this,
);
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
var tabs = const <Tab>[
Tab(icon: Icon(Icons.home), text: 'Tab 1'),
Tab(icon: Icon(Icons.account_box), text: 'Tab 2')
];
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: TabBarView(controller: controller, children: <Widget>[
ListView(children: <Widget>[
Column(children: <Widget>[
for (int i = 0; i < 48; i++) Text('Data $i'),
])
]),
const Center(child: Text('Tab 2'))
]),
bottomNavigationBar: Material(
color: Colors.deepOrange,
child: TabBar(controller: controller, tabs: tabs),
),
);
}
}
我什至将 TabBarView childrens(Tab 1 和 Tab 2)分开到另一个类中,我注意到
@override
Widget build(BuildContext context) {
...
}
每次我滑动到其容器选项卡时,都会执行每个子项(Tab 1 和 Tab 2)的方法。
我的问题是:
1.- 即使我在标签之间移动,如何保持 ListView 的滚动?
2.- 有没有办法执行
@override
Widget build(BuildContext context) {
}
如果我将 TabBarView 子类(Tab 1 和 Tab 2)分离到另一个类,则只使用一次方法? 我的意思是,如果我必须在创建 Tab 1 和 Tab 2 时检索数据,我不想每次刷入 Tab 时都这样做。那会很昂贵。
3.- 一般来说,有没有办法防止每次滑动到该选项卡时重新构建选项卡 View (包括其变量、数据等)?
提前致谢。
最佳答案
如果你给每个 TabBarView 一个 PageStorageKey 滚动偏移量将被保存。查看有关 PageStorageKey here 的更多信息.
https://stackoverflow.com/questions/45341721/