Flutter - TabBarView 内部的 ListView 失去滚动位置

我有一个非常简单的 Flutter 应用,它有一个 TabBarView 和两个 View (Tab 1Tab 2),其中一个(Tab 1) 有一个带有许多简单文本小部件的 ListView,问题是在我向下滚动 Tab 1 的 ListView 元素后,如果我从 Tab 滑动1Tab 2 最后我从 Tab 2Tab 1Tab 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/

相关文章:

dart - 在 flutter 中以编程方式关闭模态底部表

flutter - 如何在 flutter 中制作圆形 TextField?

dart - Flutter 中的装饰图像模糊

dart - Flutter 中具有 Snap 效果的水平滚动卡片

firebase - Flutter 和 google_sign_in 插件 : PlatformE

dart - 未找到方向性小部件

flutter - 禁用 TabBar flutter 中的滑动标签

flutter - 自定义卡片形状 Flutter SDK

json - 如何在 flutter 中反序列化来自json的对象列表

dart - Flutter:忽略小部件上的触摸事件