我在屏幕上使用PageView导航到另一个屏幕。我有3个屏幕Home
,History
和History Detail
。
一切都很好,我可以转到history
屏幕。直到我从History Detail
屏幕重定向到History
并返回Navigator.of(context).pop
,我才重定向到Home
屏幕。我想从History Detail
返回后继续停留在History
屏幕中。
我已经初始化了initialPage为 0 ,并使用onPageChanged
更改了initialPage,但是什么也没有发生,我仍然重定向到Home
屏幕。
我该怎么办?
这是我的源代码。
PageController _pageController;
int currentPage = 0;
@override
void initState() {
_pageController = PageController(initialPage: currentPage);
super.initState();
}
Widget build(BuildContext context) {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
double mqHeight = MediaQuery.of(context).size.height;
return Scaffold(
key: _scaffoldKey,
body: FutureBuilder(
future: Hive.openBox("debt_box"),
builder: (ctx, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError)
return Text(snapshot.error.toString());
else
return Scaffold(
body: PageView(
scrollDirection: Axis.vertical,
onPageChanged: (index) {
currentPage = index;
print(currentPage);
},
physics: NeverScrollableScrollPhysics(),
controller: _pageController,
children: <Widget>[
CustomScrollView(
slivers: <Widget>[
SliverAppBarHome(),
SliverListHome(_scaffoldKey),
],
),
HistoryDebt(),
],
),
);
} else {
return Center(child: CircularProgressIndicator());
}
},
),
bottomNavigationBar: BottomAppBar(
shape: CircularNotchedRectangle(),
child: Container(
height: mqHeight * 0.08,
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
IconButton(
icon: Icon(Icons.home),
onPressed: () =>
functionHelper.previousButtonPageView(_pageController),
),
IconButton(
icon: Icon(Icons.insert_chart),
onPressed: () =>
functionHelper.nextButtonPageView(_pageController),
),
],
),
),
),
}
最佳答案
我发现了问题。
当您按下返回按钮时,它将重新构建您的主窗口小部件。在build
方法中,您具有FutureBuilder
,它也会重新生成。
这样它将显示CircularProgressIndicator
。由于Hive.openBox("debt_box")
即时提供结果,因此您看不到它。
在显示CircularProgressIndicator
时,您的PageView
被停用(从小部件树中删除)。因此_pageController
失去了它的客户。
在CircularProgressIndicator
之后,将创建一个新的PageView
。
这就是为什么它显示Home
页面
解决方案:
根据document,我们不应在构建过程中直接分配future: Hive.openBox("debt_box")
。而是创建一个Future
变量并在initState
中对其进行初始化,然后将该变量传递给future
的FutureBuilder
属性
PageController _pageController;
int currentPage = 0;
Future _openBox;
@override
void initState() {
_pageController = PageController(initialPage: currentPage);
_openBox = Hive.openBox("debt_box"); //initialize here
super.initState();
}
Widget build(BuildContext context) {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
double mqHeight = MediaQuery.of(context).size.height;
return Scaffold(
key: _scaffoldKey,
body: FutureBuilder(
future: _openBox, //pass the future variable here
builder: (ctx, snapshot) {
...
关于flutter - Flutter:PageView保持停留在上一个屏幕,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59402730/