【问题标题】:Flutter web - setting height to 100% and not 100vhFlutter web - 将高度设置为 100% 而不是 100vh
【发布时间】:2019-10-27 09:17:47
【问题描述】:

在 HTML 中创建一个分为 2 列的页面,跨越 100% 的屏幕高度很容易

<div id="row">

<div id="column1" style="width:75%; height:100%"></div>
<div id="column2" style="width:25%; height:100%"></div>

</div>

使用 Flutter 这似乎比它应该的要复杂,我尝试通过两种方式实现上述目标:(页面的轮廓是 CustomScrollView -&gt; SliverToBoxAdapter -&gt; Row -&gt; Columns

  • 使用MediaQuery 将列的高度设置为deviceSize.height。这失败了,因为随着左列比右列大,右列没有扩大到匹配的大小。

  • 使用ExpandedFlexible(紧或松)尝试扩大高度。这不起作用。

我的问题是如何在 Flutter web 中实现 100% 高度而不是 100vh 高度?

编辑:

这说明了问题,右列的大小没有扩大到与左列匹配。

CustomScrollView(
    slivers: <Widget>[
      SliverFillRemaining(
        child: Container(
          color: Colors.purple,
          child: SingleChildScrollView(
            child: Row(
              children: <Widget>[
                Container(
                  color: Colors.blue,
                  child: Column(
                    children: <Widget>[
                      Text("test"),
                      SizedBox(height: 300),
                      Text("test"),
                      SizedBox(height: 300),
                      Text("test"),
                      SizedBox(height: 300),
                      Text("test"),
                      SizedBox(height: 300),
                    ],
                  ),
                ),
                Container(
                  color: Colors.yellow,
                  child: Column(
                    children: <Widget>[Text("test")],
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    ],
  );

【问题讨论】:

  • 好的..现在问题很清楚了。因此,您希望黄色 Text 小部件在其增长时扩展并拉伸其高度以匹配左侧列表的高度。这可能有点挑战性,因为持有这个小部件的容器不共享与其兄弟相同的约束。我会试一试的。
  • 是的,很抱歉不清楚!感谢您的帮助!

标签: flutter flutter-web


【解决方案1】:

不确定这是否是您想要的。但根据您的陈述,我认为您正在寻找两列布局,如here 和如下图所示。

以下是相同的代码。您可以在 Expanded 小部件中调整 flex 值以获得所需的屏幕宽度比。但是如果你想像使用拖动手柄一样调整每列的宽度,那么仅此一项就足够了。

import 'package:flutter/material.dart';

class FullHeightDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
        child: Row(
      children: <Widget>[
        Expanded(
          flex: 4,
          child: Container(
            color: Colors.red,
            child: Center(
              child: Text(
                'Column-1',
                style:
                    TextStyle(fontWeight: FontWeight.bold, color: Colors.black),
              ),
            ),
          ),
        ),
        Expanded(
          flex: 1,
          child: Container(
            child: Container(
              color: Colors.teal,
              child: Center(
                child: Text(
                  'Column-2',
                  style: TextStyle(
                      fontWeight: FontWeight.bold, color: Colors.black),
                ),
              ),
            ),
          ),
        )
      ],
    ));
  }
}

在 Scrollable 小部件中使用 MediaQuery 指定高度可能会有所帮助

以下代码将列放置在SingleChildScrollableView 小部件内,并根据MediaQuery 指定容器的高度以实现相同的目的。这会有帮助吗? LayoutBuilder 只是为了表明使用其约束中的高度也可能导致错误,因为在这种情况下它的高度也是 infinite

import 'package:flutter/material.dart';

class FullHeightDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: LayoutBuilder(
        builder: (context, constraints) {
          var size = MediaQuery.of(context).size;
          return Container(
            child: Row(
              children: <Widget>[
                Container(
                  height: size.height,
                  // height: constraints.maxHeight,
                  width: constraints.maxWidth / 2,
                  color: Colors.red,
                  child: Center(
                    child: Text(
                      'Column 1',
                      style: TextStyle(
                        fontWeight: FontWeight.bold,
                        color: Colors.black,
                      ),
                    ),
                  ),
                ),
                Container(
                  color: Colors.green,
                  height: size.height,
                  // height: constraints.maxHeight,
                  width: constraints.maxWidth / 2,
                  child: Center(
                    child: Text(
                      'Column 2',
                      style: TextStyle(
                          fontWeight: FontWeight.bold, color: Colors.black),
                    ),
                  ),
                )
              ],
            ),
          );
        },
      ),
    );
  }
}

【讨论】:

  • 如果不需要滚动,此答案有效,但如果您添加任何类型的滚动小部件,它会中断,我尝试了SingleChildScrollViewCustomScrollViewListView。看看他们!
  • 我不确定你想要达到什么目的。但是SingleChildScrollViewCustomScrollViewListView 所有这些滚动视图都会尝试缩小其子视图。本质上,这些小部件带有高度约束 infinity 以适应越来越多的孩子,当你放置一个没有高度约束的孩子时,这就会成为冲突,这意味着孩子不能像列表视图一样长,而列表视图不能缩小没有特定身高的孩子。因此,您应该始终在 ScrollView 类型的小部件中定义孩子的高度。
  • 我试图实现与您显示的相同的布局,但在 ScrollView 中。如果我现在想在 Flutter 中创建一个网站,并且其中一个要求是布局是多列布局,这是无法实现的吗?因此我对 **100% 高度的问题 **
  • 我将使用示例代码编辑我的问题以说明问题所在。
  • 编辑后的答案仍然没有解决问题。我认为理解这个问题的唯一方法是尝试创建一个具有两列布局的网站,其中右列比左列有更多的小部件(超过视口高度,也就是向整个页面添加滚动)。如果您想将我提供的示例复制粘贴到scaffold
猜你喜欢
  • 2021-03-30
  • 2015-02-11
  • 1970-01-01
  • 2021-06-29
  • 2018-06-30
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多