在显示的第一个页面上方,我显示了一条消息,用户可以向左滑动以转到下一页.在onPageChanged中,我设置了一个bool来忽略消息并调用setState.当我滑动到页面1时,在调用setState的时刻,页面重置为页面0.

当我删除条件文本时,页面正常滑动.

达特帕德主旨:https://dartpad.dev/?id=e30a98e4bc531d9cdc93780b6e47f972

这是一个错误,还是我错过了什么?

完整的示例代码如下:

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(PageViewTestScreen());
}

class PageViewTestScreen extends StatefulWidget {
  PageViewTestScreen({super.key});

  @override
  State<PageViewTestScreen> createState() => _PageViewTestScreenState();
}

class _PageViewTestScreenState extends State<PageViewTestScreen> {
  PageController pageController = PageController(initialPage: 0);
  bool lastPage = false;
  bool userHasSlided = false;
  int numberOfPages = 5;

  @override
  void initState() {
    super.initState();
  }

  void onPageChanged(int index) {
    userHasSlided = true;

    lastPage = index == levensgebieden.length-1;
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        floatingActionButton: lastPage
            ? FloatingActionButton(
                onPressed: () {},
                child: Icon(Icons.check),
              )
            : null,
        appBar: AppBar(
          foregroundColor: Colors.white,
          title: const Text("PageView bug?"),
        ),
        body: ListView(
          children: [
            const Text("Here are some pages"),
            const SizedBox(height: 6),
            if (!userHasSlided) const Text("Swipe left to continue."),
            SizedBox(
              height: 500,
              child: PageView(
                scrollBehavior: const ScrollBehavior().copyWith(dragDevices: {
                  PointerDeviceKind.touch,
                  PointerDeviceKind.mouse,
                  PointerDeviceKind.stylus,
                }),
                controller: pageController,
                onPageChanged: (int index) {
                  onPageChanged(index);
                },
                children: [
                  for (int i = 0; i < 5; i++) card(i),
                ],
              ),
            )
          ],
        ),
      ),
    );
  }

  Widget card(int index) {
    return Card(
      child: SizedBox(
          height: 500, width: 200, child: Center(child: Text("Page: $index"))),
    );
  }
}

推荐答案

对于这样的情况,提供key有助于元素树.

SizedBox(
  key: const Key("my_pageView"),
  height: 500,
  child: PageView(

更多约Keys.

Flutter相关问答推荐

ShaderMask上的文本渐变问题

你能go 掉Flutter 小部件测试中的样板吗?

在LinkedIn上分享Fighter和Web的链接会产生不同的结果

将侧边菜单和底部导航栏放在同一Flutter 应用程序中

顶部对齐ListTile的[前导、标题、尾随]小部件

为什么我的Flutter 动画过渡没有发生?

处理 flutter/dart 模型中的空值

Firestore 不会取代 map

使用 flutter_svg 在 flutter 中的 Canvas 上绘制 SVG 图像

如何使自动焦点位于已经有一些文本的 TextField 的第一行?

有没有办法在 google_map 上移动标记(向左或向右移动一些像素)?

如何从flutter连接PostgreSQL数据库?

Flutter 火焰相机抖动已弃用

显示图像的放大部分

如何设置行中项目之间的空格相等?

忽略异步函数上的 context.mounted 访问 linting 错误是否安全?

我无法从 Cloud firestore 访问文档字段并在 statefulwidget 类中显示它

仅使用 Flutter 在本地环境中托管 Web 服务器

在 Flutter 中,您什么时候应该更喜欢Widget继承而不是组合?

如何在Flutter 中专注于列表视图中最新添加的项目