如何在Flutter的滚动视图中限制滚动距离?

时间:2017-09-12 09:38:08

标签: dart flutter

我创建了一个页面,其中包含一个列中的多个文本字段和按钮,该列包含在具有背景图像的容器中。而这个容器本身就是一个scrollview小部件的子代。

因此,当一个人点击其中一个字段时,他们的键盘会弹出(占据屏幕的一部分),这意味着一些按钮/字段在屏幕外,这是scrollview小部件用于其目的的地方。

这里的问题是我想限制滚动视图允许用户滚动的距离。

最低按钮下方有一些空白区域,我不希望用户能够一直滚动到那里。这也是让体验变得简单而没有用户" overscroll"经过他应该输入的字段。

但由于背景图像是滚动视图的一部分,因此视图将允许用户向下滚动到图像底部。我想限制这个。

作为后续工作,我试图弄清楚如何设置初始滚动位置。 (因此,当单击某个字段时,滚动视图会向下滚动到第一个文本字段,因此所有字段都在视图中。用户无需向下滚动它们。但我不希望此滚动位置重新显示 - 当然,每当用户点击某个字段时应用。)

这是相关的(如果我的任何代码看起来非常糟糕请说出来,我是一般的编程新手并接受任何改进的建议):

class LoginPageConstructor extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    AssetImage loginBackgroundAsset =
        new AssetImage("assets/loginscreen/backgroundrock.png");
//    var _scrollController = new ScrollController(
//        initialScrollOffset: 200.0,
//        keepScrollOffset: true);
    return new Scaffold(
        body: new Container(
      child: new ListView(key: new PageStorageKey("Divider 1"),
//        controller: _scrollController,
        children: <Widget>[
          new Stack(children: <Widget>[
            new Container(
            constraints: new BoxConstraints.expand(height: 640.0),
              decoration: new BoxDecoration(
                  image: new DecorationImage(
                      image: loginBackgroundAsset, fit: BoxFit.cover)),
            child: new Column(
              children: <Widget>[
                new Divider(height: 300.0,),
                new Center(child: new UsernameText(),),
                new Divider(height: 8.0,),
                new Center(child: new PasswordText(),),
                new Divider(),
                new LoginButton(),
                new Divider(),
                new SignUpButton(),
              ],
            ))
          ])
        ],
      ),
    ));
  }
}

1 个答案:

答案 0 :(得分:6)

为了将字段自动滚动到视图中,听起来好像在和issue 10826进行摔跤。我在这个问题上发布了workaround。我将解决方法改为您的示例代码;见下文。 (你可能想稍微调整一下。)

如果您想阻止用户滚动,您可能只想确保使用下面相同的技术显示所有字段,然后使用NeverScrollableScrollPhysics作为{{1}的physics }}。或者,如果您有野心,可以实现自定义滚动物理,如Gallery example所示。如果我是你,我会坚持要#10826修复。

video

ListView