flutter - 颤振:在 TabBarView 中动态添加/删除选项卡
问题描述
我想制作类似电子书的应用程序,它有很长的页面列表,我可以向左或向右滑动以转到下一页/上一页。因为我们将有数千页,并且页数会根据书的长度而有所不同,所以在一开始就构建所有页面是没有意义的。
我正在尝试使用带有 3 个初始页面(上一页 - 当前 - 下一页)的 TabBarView,并在用户向左或向右滑动时动态添加和删除选项卡。
我在这里做了一个简化版本:
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
home: new MyTabbedPage(),
); } }
class MyTabbedPage extends StatefulWidget { const MyTabbedPage({Key key}) : super(key: key);
@override _MyTabbedPageState createState() => new
_MyTabbedPageState(); }
class _MyTabbedPageState extends State<MyTabbedPage> with SingleTickerProviderStateMixin { int num = 4; final List<Tab> myTabs = <Tab>[
new Tab(text: '1'),
new Tab(text: '2'),
new Tab(text: '3'), ];
TabController _tabController;
@override void initState() {
super.initState();
_tabController = new TabController(vsync: this, length: myTabs.length, initialIndex: 1);
_tabController.addListener(_handleTabChange); }
@override void dispose() {
_tabController.dispose();
super.dispose(); }
void _handleTabChange() {
myTabs.add(new Tab(text: num.toString()));
myTabs.removeAt(0);
_tabController.animateTo(1); }
@override Widget build(BuildContext context) {
return new Scaffold(
body: new TabBarView(
controller: _tabController,
children: myTabs.map((Tab tab) {
return new Center(child: new Text(tab.text));
}).toList(),
),
); } }
我的意图是
- 初始标签:1、2、3
- 向右滑动后,_handleTabChange 执行,tab4 添加,tab1 移除,animateTo tab3,所以最终结果是 2, 3, 4 --> 当前页面是 tab3
但它不会添加或删除页面,滑动后我只有tab1、2、3。
我的问题是
- 有没有比 TabBarView 更好的方法来制作这本电子书的滑动 UI?
- 如果答案是肯定的,我该如何解决这个问题?
解决方案
有没有比 TabBarView 更好的方法来制作这本电子书的滑动 UI?
是的,有PageView
小部件。
如果答案是肯定的,我该如何解决这个问题?
PageView
强制其每个子级或Pages
扩展以占用所有可用空间,这是您首先想要通过使用TabView
. 此外,它使您能够Pages
使用PageView.builder
类似于ListView.builder
通过显式指定页数以及在需要时构造每个页的机制来构建动态。这将显着提高您的应用程序的性能。PageView
类还为您提供专业的效果,就像著名的电子书阅读器提供的PageSnapping
效果一样。
如果您想构建一个自定义的PageView
,您可以使用PageView.custom
构造函数。
推荐阅读
- python - 熊猫中是否有等效的excel公式
- python - 组织循环的最佳方式是什么?
- r - 交错来自 Rcpp 中的许多对象的结果
- python - Python 3,正确调用函数
- axios - 如何传递“|” Axios URL 中的符号?
- python - 枕头坏了 - 哈希冲突::1 和 1 均为 22
- java - Java,数组返回
- node.js - 从rest api mysql验证用户
- android - XmlPullParserException:元数据不以输入法标记开头(Android 自定义键盘)
- android - 带有 Google API 的 Android Studio 3.1.1 模拟器无法连接到互联网