我在屏幕上使用PageView导航到另一个屏幕。我有3个屏幕HomeHistoryHistory 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),
              ),
            ],
          ),
        ),
      ),
  }

flutter - Flutter:PageView保持停留在上一个屏幕-LMLPHP

最佳答案

我发现了问题。

当您按下返回按钮时,它将重新构建您的主窗口小部件。在build方法中,您具有FutureBuilder,它也会重新生成。

这样它将显示CircularProgressIndicator。由于Hive.openBox("debt_box")即时提供结果,因此您看不到它。

在显示CircularProgressIndicator时,您的PageView被停用(从小部件树中删除)。因此_pageController失去了它的客户。

CircularProgressIndicator之后,将创建一个新的PageView

这就是为什么它显示Home页面

解决方案:

根据document,我们不应在构建过程中直接分配future: Hive.openBox("debt_box")。而是创建一个Future变量并在initState中对其进行初始化,然后将该变量传递给futureFutureBuilder属性

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/

10-16 09:30