复制步骤:向左滑动,切换到红色Tab
,然后再次切换到紫色Tab
。
什么是:执行步骤后再现,第一个Tab
的PageView
再次在蓝页。
应该是:在执行步骤以再现之后,第一个Tab
的PageView
仍然在绿色页。
我错过了什么?
import "package:flutter/material.dart";
import "package:flutter/services.dart";
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIOverlays([]);
return MaterialApp(
home: MyHome()
);
}
}
class MyHomeState extends State<MyHome> with TickerProviderStateMixin {
TabController tabController;
@override
void initState() {
tabController = tabController?? TabController(
vsync: this,
length: 2
);
super.initState();
}
@override
void dispose() {
tabController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
TabBar(
controller: tabController,
tabs: [
Container(
color: Colors.purple,
width: 100.0,
height: 50.0
),
Container(
color: Colors.pink,
width: 100.0,
height: 50.0
)
]
),
Expanded(
child: TabBarView(
controller: tabController,
children: [
MyPageView(),
MyPageView(),
],
)
)
]
)
);
}
}
class MyHome extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return MyHomeState();
}
}
class MyPageViewState extends State<MyPageView> {
PageController pageController;
@override
void initState() {
pageController = pageController?? PageController();
super.initState();
}
@override
void dispose() {
pageController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return PageView(
controller: pageController,
children: [
Container(
color: Colors.blue
),
Container(
color: Colors.green
)
]
);
}
}
class MyPageView extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return MyPageViewState();
}
}
2条答案
按热度按时间tag5nh1u1#
这个问题用
AutomaticKeepAliveClientMixin
解决了。我以前用过这个,但由于混淆了错误的状态。显然,它必须与包含您想要keep alive
的状态的类混合在一起。6xfqseft2#
我遇到了这个问题,找到了一个更简单的方法来做到这一点,那就是在statefulwidget类之外创建一个变量,比如
int index = 0
,这样当创建该小部件时,甚至在创建状态之前就应该有getter和setter,所以当使用Navigator()调用该类时,页面的索引是不变的。参见下面的示例