【问题标题】:Flutter widget that doesn't occupy any space on screen不占用屏幕任何空间的 Flutter 小部件
【发布时间】:2022-01-18 19:27:02
【问题描述】:

在颤振中,我想在我的应用程序中使用一个小部件,如果不满足条件,则会打印一个容器(或任何其他小部件),其中不包含屏幕上的空间。 实际上我想要一个在颤动中不覆盖屏幕空间的小部件。

【问题讨论】:

    标签: flutter flutter-layout


    【解决方案1】:

    使用SizedBox.shrink()

    例如:

    SomeWidget(
      child: boolShow ? YourWidget() : SizedBox.shrink(),
    )
    

    【讨论】:

    • 使用.shrink而不是简单地使用SizedBox()有什么优势吗?
    • @user1032613 SizedBox.shrink()widthheight 设置为0,默认情况下初始化null。一般来说,您也可以使用SizedBox 来代替SizedBox.shrink,但使用shrink 这个词可以清楚地表明该小部件将在屏幕上占用最少(或零)空间。使用SizedBox() 可能会被误解,就像您忘记为其提供小部件一样?可能还有其他我现在无法想到的情况。
    • 这很公平。我也在询问之前阅读了源代码,将大小初始化为null 将是相同的,因为它不是child,因此只要其父约束允许,它将占用最小的空间。除非明确说明0 会以某种方式优化布局约束求解器,但我找不到任何证据,并且布局过程已经是一次性的。也许它只是归结为语义......
    【解决方案2】:

    只需使用 Container() 或 SizedBox()。 不要给出任何高度、宽度或子级。

    【讨论】:

    • 容器太重,不宜使用
    • 我都用过,但对我不起作用。
    • 请在任何你想要这个无空间小部件的地方分享你的代码。
    【解决方案3】:

    有两种方法可以做到这一点。

    首先,如果满足条件,您可以显示一个高度为 0 的空 SizedBox。如果条件不满足,则显示所需的小部件。这将如下所示:

    child: if_condition_is_met ? Container(child: ...) : const SizedBox(),
    

    如果你在列中应用条件,你可以试试下面的代码。

    Column(
      children: [
        if(the_condition_is_not_met)
          Container(child: ---- your widgets ---),
      ]
    )
    

    你也可以使用dialog box来显示消息

    showDialog(
        context: context,
        builder: (context) => AlertDialog(
          shape: RoundedRectangleBorder(
            borderRadius: const BorderRadius.all(
              Radius.circular(20),
            ),
            side: BorderSide(
              color: Colors.black,
              width: 3,
            ),
          ),
          title: Text(
            'give_a_title',
          ),
          content: Text(
            'some_text',
          ),
          actions: [
            SizedBox(
              child: TextButton(
                onPressed: (){},
                child: Text(
                  'Ok',
                ),
              ),
            )
          ]
        ),
      );
    

    【讨论】:

      猜你喜欢
      • 2020-06-09
      • 2020-08-19
      • 2022-07-06
      • 2023-03-03
      • 2015-02-12
      • 1970-01-01
      • 2021-05-05
      • 2020-12-25
      • 2020-03-27
      相关资源
      最近更新 更多