如何使整个页面可滚动?

Posted

技术标签:

【中文标题】如何使整个页面可滚动?【英文标题】:How can I make the whole page scrollable? 【发布时间】:2019-03-05 08:06:58 【问题描述】:

我想让整个页面可滚动,即包含表单和 FirebaseAnimatedList 的父 Column 小部件,而不仅仅是可滚动的 FirebaseAnimatedList。

长期以来,我一直坚持这一点,并尝试了各种不同的小部件,但无法成功。 请帮忙。

Column(
    children: <Widget>[
      Flexible(
        flex: 0,
        child: Center(
          child: Form(
            key: formkey,
            child: Flex(
              direction: Axis.vertical,
              children: <Widget>[
                ListTile(
                  leading: Icon(Icons.subject),
                  title: TextFormField(
                    initialValue: "",
                    onSaved: (val) => board.subject = val,
                    validator: (val) => val == "" ? val : null,
                  ),
                ),
                ListTile(
                  leading: Icon(Icons.message),
                  title: TextFormField(
                    initialValue: "",
                    onSaved: (val) => board.body = val,
                    validator: (val) => val == "" ? val : null,
                  ),
                ),
                Padding(
                  padding: EdgeInsets.all(10.0),
                  child: FlatButton(
                    child: Text(
                      "POST",
                      style: TextStyle(color: Colors.white),
                    ),
                    color: Colors.blueGrey,
                    onPressed: () 
                      handleSubmit();
                    ,
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
      Flexible(
        child: FirebaseAnimatedList(
          query: databaseReference,
          itemBuilder: (_, DataSnapshot snapshot,
              Animation<double> animation, int index) 
            return Card(
              child: ListTile(
                leading: CircleAvatar(
                  backgroundColor: Colors.blueAccent,
                ),
                title: Text(boardMessages[index].subject),
                subtitle: Text(boardMessages[index].body),
              ),
            );
          ,
        ),
      ),
    ],
  ),

使用 SingleChildScrollView,我可以通过按住表单小部件来滚动页面,但它不会通过按住 FirebaseAnimatedList 小部件来滚动。

LayoutBuilder(
    builder: (BuildContext context, BoxConstraints viewportConstraints) 
      return SingleChildScrollView(
        child: new ConstrainedBox(
          constraints: new BoxConstraints(
            minHeight: viewportConstraints.maxHeight,
          ),
          child: new Column(
            mainAxisSize: MainAxisSize.min,
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: <Widget>[
              new Container(
                height: 180.0,
                child: Center(
                    child: Form(
                      key: formkey,
                      child: Flex(
                        direction: Axis.vertical,
                        children: <Widget>[
                          ListTile(
                            leading: Icon(Icons.subject),
                            title: TextFormField(
                              initialValue: "",
                              onSaved: (val) => board.subject = val,
                              validator: (val) => val == "" ? val : null,
                            ),
                          ),
                          ListTile(
                            leading: Icon(Icons.message),
                            title: TextFormField(
                              initialValue: "",
                              onSaved: (val) => board.body = val,
                              validator: (val) => val == "" ? val : null,
                            ),
                          ),
                          Padding(
                            padding: EdgeInsets.all(10.0),
                            child: FlatButton(
                              child: Text(
                                "POST",
                                style: TextStyle(color: Colors.white),
                              ),
                              color: Colors.blueGrey,
                              onPressed: () 
                                handleSubmit();
                              ,
                            ),
                          ),
                        ],
                      ),
                    ),
                  ),
              ),
              new Container(
                height: 2000.0,
                child: FirebaseAnimatedList(
                    query: databaseReference,
                    itemBuilder: (_, DataSnapshot snapshot,
                        Animation<double> animation, int index) 
                      return Card(
                        child: ListTile(
                          leading: CircleAvatar(
                            backgroundColor: Colors.blueAccent,
                          ),
                          title: Text(boardMessages[index].subject),
                          subtitle: Text(boardMessages[index].body),
                        ),
                      );
                    ,
                  ),
              ),
            ],
          ),
        ),
      );
    ,
  )

包含 FirebaseAnimatedList 的 Container 的高度应该是多少?

【问题讨论】:

SinglePageScrollView 可能是你想要的。或列表视图 同意@RémiRousselet,这是可能的两种简单方法。 @RémiRousselet 感谢您的快速回复。使用 SingleChildScrollView 我可以通过按住表单小部件来滚动页面,但它不会通过按住 FirebaseAnimatedList 小部件来滚动。 【参考方案1】:

尝试将 Column() 更改为 ListView() 还尝试在 FirebaseAnimatedList 之外添加一个列表视图 容器()

    ListView(
children: <Widget>[
  Flexible(
    flex: 0,
    child: Center(
      child: Form(
        key: formkey,
        child: Flex(
          direction: Axis.vertical,
          children: <Widget>[
            ListTile(
              leading: Icon(Icons.subject),
              title: TextFormField(
                initialValue: "",
                onSaved: (val) => board.subject = val,
                validator: (val) => val == "" ? val : null,
              ),
            ),
            ListTile(
              leading: Icon(Icons.message),
              title: TextFormField(
                initialValue: "",
                onSaved: (val) => board.body = val,
                validator: (val) => val == "" ? val : null,
              ),
            ),
            Padding(
              padding: EdgeInsets.all(10.0),
              child: FlatButton(
                child: Text(
                  "POST",
                  style: TextStyle(color: Colors.white),
                ),
                color: Colors.blueGrey,
                onPressed: () 
                  handleSubmit();
                ,
              ),
            ),
          ],
        ),
      ),
    ),
  ),
  Flexible(
    child: FirebaseAnimatedList(
      query: databaseReference,
      itemBuilder: (_, DataSnapshot snapshot,
          Animation<double> animation, int index) 
        return Card(
          child: ListTile(
            leading: CircleAvatar(
              backgroundColor: Colors.blueAccent,
            ),
            title: Text(boardMessages[index].subject),
            subtitle: Text(boardMessages[index].body),
          ),
        );
      ,
    ),
  ),
],
),

【讨论】:

【参考方案2】:

您希望整个页面可滚动,这意味着它需要将内容包装在ScollView(ListView) 中。

这将使scrollView(FirebaseAnimatedList) inside 成为另一个ScrollView(ListView)。 Flutter 无法自行处理此问题。我们必须向它提供更多信息。

选项:

    提供内部滚动视图的高度。

    Container(
       height: 500.0, //some constant value
       child: FirebaseAnimatedList(...))
    

    按住 FirebaseAnimatedList 小部件不会滚动。

    使innerScollView 不可滚动。

    FirebaseAnimatedList(
       shrinkWrap: true,
       physics: NeverScrollableScrollPhysics(),
       itemBuilder: ...)
    

通过按住 FirebaseAnimatedList 小部件来滚动。 注意:但它会加载列表中的所有元素(假设您有 200 个项目,无论项目是否可见,它都会加载所有 200 个项目)。

【讨论】:

这行得通,但 FirebaseAnimatedList 每个项目的高度不固定。如果它是固定的,我会以这种方式给容器高度:Container( height: boardMessages.length * Some_constant_value , child: FirebaseAnimatedList(...)) 但它不是固定的。 如果你想要boardMessages.length * some_constant_value,选项二就可以了。 为了完成这项工作,我必须将这两个选项结合起来。这就是我的代码的样子:Container( height: boardMessages.length * 80.0, child: FirebaseAnimatedList( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), query: databaseReference, itemBuilder: 如果你没有将 FirebaseAnimatedList 包裹在 Container 内,会发生什么?【参考方案3】:

您可以在 ListView 中添加 FirebaseAnimatedList 和其他项目,如下所示:

ListView(
    shrinkWrap: true,
    children: <Widget>[
         _buildCard(),
         FirebaseAnimatedList(...),
]);

你也应该禁用 FirebaseAnimatedList 滚动

FirebaseAnimatedList(
         physics: NeverScrollableScrollPhysics(),
         shrinkWrap: true, ...)

【讨论】:

以上是关于如何使整个页面可滚动?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 UICollectionView 像书一样翻转整个页面

如何隐藏滚动条并使内容可滚动? [复制]

在 Xcode 中根据设备的高度使页面可滚动

Vuetify 工具栏和居中块使页面可滚动

flexbox子元素中的CSS可滚动内容

如何使用 ListView.separated 使整个屏幕可滚动