Flutter 中的索引堆叠。如何在所有其他小部件之上显示容器?

Posted

技术标签:

【中文标题】Flutter 中的索引堆叠。如何在所有其他小部件之上显示容器?【英文标题】:Indexed Stacking in Flutter. How to display container above all other widgets? 【发布时间】:2021-12-08 04:14:09 【问题描述】:

我尝试创建一个通知按钮,该按钮显示应用程序内的所有未读通知,我们如何从社交媒体应用程序中得知这些通知。

单击通知图标时,我想打开包含所有新通知的列表。

我的问题:我无法让堆叠工作。我正在使用Stack 小部件,但我需要列表容器浮动在所有其他小部件之上。它必须始终位于顶部。

它的样子

如您所见,蓝色容器并未位于所有小部件的前面。我们如何在 Flutter 中管理它以将其展示在大家面前? CSS 中的 position: fixed; z-index: 9999 之类的东西。

我的代码

return Scaffold(
  backgroundColor: Get.theme.colorScheme.primary.darken(.05),
  body: Column(
    children: [
      SizedBox(
        height: 50,
        child: WindowTitleBarBox(
          child: MoveWindow(
            child: NotificationBar(),
          ),
        ),
      ),
      Expanded(
        child: Row(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            MainNavigation(),
            Flexible(child: this.child!),
          ],
        ),
      ),
    ],
  ),
);


class NotificationBar extends StatelessWidget 
  const NotificationBar(
    Key? key,
  ) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return Container(
      padding: EdgeInsets.only(top: 10, bottom: 10, right: 35),
      alignment: Alignment.centerRight,
      child: Indexer(
        clipBehavior: Clip.none,
        children: [
          Icon(
            Icons.notifications,
            size: 25,
          ),
          Positioned(
            left: 12,
            bottom: 12,
            child: Badge(
              content: "2",
              minHeight: 5,
              minWidth: 12,
              fontSize: 7,
            ),
          ),
          Positioned(
            top: 30,
            right: 0,
            child: Container(
              clipBehavior: Clip.none,
              width: 300,
              height: 500,
              color: Colors.blue,
            ),
          ),
        ],
      ),
    );
  

你有什么想法吗?

【问题讨论】:

【参考方案1】:

试试Overlay:

ElevatedButton(
  child: Text('Overlay Test'),
  onPressed: () 
    final entry = OverlayEntry(
      builder: (context) => Positioned(
        bottom: 20,
        right: 20,
        child: Container(
          width: 200,
          height: 200,
          color: Colors.blue,
        ),
      ),
    );
    Overlay.of(context)?.insert(entry);
  ,
)

要删除它,请致电entry.remove()。您可能希望将 entry 变量存储在更高的位置以便于访问,可能作为类成员变量。

【讨论】:

以上是关于Flutter 中的索引堆叠。如何在所有其他小部件之上显示容器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中的小部件下设置所有 Text 小部件的颜色?

gtkmm:将容器小部件(Box)中的元素堆叠在一起

Flutter/Dart 如何将索引从 Listview.builder 传递到项目小部件

如何在 Flutter 中滚动带有粘性标题的堆叠容器?

在 Flutter 中的小部件之间传递数据的最佳方式

如何检查两个小部件是不是在颤动中重叠?