嵌套滚动视图的颤动错误

时间:2021-07-18 10:33:42

标签: flutter scrollview

在我的 Flutter 应用程序中,我有一个带有 PageView 的屏幕,用于显示卡片。有些卡片有TextFields,所以我把Screen放到一个SingleChildScrollView中,这样Keyboard将屏幕推到最上面,不重叠。下面是代码示例:

class DummyScreen extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: PageView(
          physics: NeverScrollableScrollPhysics(),
          children: [
            DummyCard(),
          ],
        ),
      ),
    );
  }
}

现在,一些卡片有很多 TextFields,在较小的屏幕上它会太大。所以我也把它们放到了 ScrollView 中。这意味着我有一个包含 ScrollViewPageView 内、ScrollView 内的小部件: (这不是确切的代码,显然缺少样式部分)

class DummyCard extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Card(
      child: Padding(
        padding: EdgeInsets.symmetric(horizontal: 14, vertical: 14),
        child: Scrollbar(
          child: SingleChildScrollView(
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                TextFormField(
                  decoration: InputDecoration(hintText: "TextField 1"),
                ),
                SizedBox(
                  height: 10,
                ),
                TextFormField(
                  decoration: InputDecoration(hintText: "TextField 2"),
                ),
                SizedBox(
                  height: 10,
                ),
                TextFormField(
                  decoration: InputDecoration(hintText: "TextField 3"),
                ),
                SizedBox(
                  height: 10,
                ),
                TextFormField(
                  decoration: InputDecoration(hintText: "TextField 4"),
                ),
                SizedBox(
                  height: 10,
                ),
                TextFormField(
                  decoration: InputDecoration(hintText: "TextField 5"),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

Dummy Card Dummy Card

PageView 不应该是可滚动的,但应该在点击按钮时更改页面。所以这没有问题。当键盘没有打开时,这也不是问题,因为当键盘没有打开时,外部的 ScrollView 是不可滚动的。当我点击 TextField 并且键盘弹出时会出现问题。现在我在外面(整个屏幕)有一个可滚动的 ScrollView,在 ScrollView 里面有一个可滚动的 Card,这导致了以下两个问题:

  1. 滚动行为通常不好。当我点击 Card 内部的屏幕时,我只能滚动内部 ScrollView,即使我已经“滚动到最后”。因此,当我想滚动外部 ScrollView 时,我必须点按 Card 外部的屏幕,这不是很好的用户体验。
  2. 当我点击 TextField 时,我希望屏幕被推到顶部。但是由于 TextFields 位于内部 ScrollView 内部,它只会将内部 ScrollView 推到顶部,这通常会导致键盘仍然与 TextField 重叠。

我知道让 2 个 ScrollViews 具有相同的滚动方向相互嵌套并不是一个好习惯。但这是我想到的唯一解决方案。我绝对需要卡片内的 ScrollView。而且我还想在键盘弹出时将屏幕推到顶部,我不想缩小屏幕(我的布局不可能)。那么,关于如何解决上述两个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

Scaffold 有一个属性,可以防止在键盘打开时调整页面大小,默认情况下为 true。尝试将其设置为 false

<块引用>

布尔? resizeToAvoidBottomInset

相关问题