【问题标题】:How do you use CheckBoxListTile with PopupMenuButton in Flutter Web?Flutter Web 中如何使用 CheckBoxListTile 和 PopupMenuButton?
【发布时间】:2020-06-12 08:18:37
【问题描述】:

我不想使用 CheckedPopupMenuItem,因为我的目标是有一个复选框供用户交互。 但即使在 PopupMenuButton 的 CheckBoxListTile 中调用 setState,当我们点击它时它也不会重建。

代码如下:

PopupMenuButton(
  offset: Offset(100, 100),
  elevation: 5.0,
  child: _menuIcon,
  itemBuilder: (context) => [     
    PopupMenuItem(
      child: CheckBoxListTile(
               activeColor: kLeadingOrangeColor,
               value: isShow,
               onChanged: (value) => 
                   setState(() => isShow = value),
               title: checkboxLabel('Show'),
             ),
    ),
  ],
)

每次我点击它时,虽然我调用了 setState,但似乎什么也没发生。因此,为了让我看到从“选中”标记到“未选中”标记的变化,反之亦然,我必须关闭并重新打开 PopupMenuButton。

【问题讨论】:

    标签: flutter


    【解决方案1】:

    看了几个小时后,我发现这是最好的解决方案:(我认为这也适用于 CheckBox)

    1. 将 CheckBoxListTile 包装在 StatefulBuilder 中
    2. 使用 StatefulBuilder 的 SetState 重建复选框。

    这是新代码:

    PopupMenuButton(
      offset: Offset(100, 100),
      elevation: 5.0,
      child: _menuIcon,
      itemBuilder: (context) => [     
        PopupMenuItem(
          child: StatefulBuilder(
                   builder: (_context, _setState) => 
                              CheckBoxListTile(
                                 activeColor: kLeadingOrangeColor,
                                 value: isShow,
                                 onChanged: (value) =>
                                     _setState(() => isShow = value),
                                 title: checkboxLabel('Show'),
                              ),
                 ),
        ),
      ],
    )
    

    请注意,我分别为围绕 Checkbox 小部件的 StatefulBuilder 命名参数 _context 和 _setState。这样我们就可以将这个 StatefulBuilder 的上下文和 setState 与其他 StatefulWidget 区分开来。并且以防万一有人使用 Blocs 之类的东西,它将使用正确的上下文。

    因此,要重建 Checkbox,请使用 _setState 而不是 setState。

    希望这对某人有所帮助。

    如果您有更好的解决方案,我愿意接受。请随时在下面发表评论。谢谢你。

    【讨论】:

    • 我发现当在网络中使用PopupMenuButton 时,小部件没有被调用,你是这样的吗?
    猜你喜欢
    • 2022-12-13
    • 2019-07-30
    • 2020-02-12
    • 1970-01-01
    • 2021-08-19
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多