如何在 flutter App 上叠加一个小部件?

2024-03-15

我想要一个位于整个应用程序之上的小部件。当我尝试这样做时Overlay.of(context).insert替换该路线后,覆盖层随后会消失。有没有办法在我的应用程序顶部添加一个小部件,即使屏幕稍后弹出?


也许存在更优化的方式,但作为一个选项,这是一个包含两个页面的示例,本地导航器和覆盖图。

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _navigatorKey = GlobalKey<NavigatorState>();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: WillPopScope(
        onWillPop: () async => !await _navigatorKey.currentState.maybePop(),
        child: LayoutBuilder(
          builder: (context, constraints) {
            WidgetsBinding.instance.addPostFrameCallback((_) => _insertOverlay(context));
            return Navigator(
              key: _navigatorKey,
              onGenerateRoute: (RouteSettings settings) {
                switch (settings.name) {
                  case '/page2':
                    return MaterialPageRoute(builder: (_) => Page2());
                  default:
                    return MaterialPageRoute(builder: (_) => Page1(_navigatorKey));
                }
              },
            );
          },
        ),
      ),
    );
  }

  void _insertOverlay(BuildContext context) {
    return Overlay.of(context).insert(
      OverlayEntry(builder: (context) {
        final size = MediaQuery.of(context).size;
        print(size.width);
        return Positioned(
          width: 56,
          height: 56,
          top: size.height - 72,
          left: size.width - 72,
          child: Material(
            color: Colors.transparent,
            child: GestureDetector(
              onTap: () => print('ON TAP OVERLAY!'),
              child: Container(
                decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.redAccent),
              ),
            ),
          ),
        );
      }),
    );
  }
}

class Page1 extends StatelessWidget {
  final GlobalKey<NavigatorState> navigatorKey;

  Page1(this.navigatorKey);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.green[200],
      appBar: AppBar(title: Text('Page1')),
      body: Container(
        alignment: Alignment.center,
        child: RaisedButton(
          child: Text('go to Page2'),
          onPressed: () => navigatorKey.currentState.pushNamed('/page2'),
        ),
      ),
    );
  }
}

class Page2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.yellow[200],
      appBar: AppBar(title: Text('back to Page1')),
      body: Container(
        alignment: Alignment.center,
        child: Text('Page 2'),
      ),
    );
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 flutter App 上叠加一个小部件? 的相关文章

随机推荐

  • 如何定义 MKAnnotationView 重叠的顺序?

    我的地图中有几个 MKAnnotations 及其相应的视图 有时会变得非常拥挤 现在 我的应用程序中的注释有两种风格 有些必然会保留在原处 而另一些则会随着时间的推移而移动 我更喜欢让视觉上更稳定的物体出现在背景中 而移动的物体总是在它们
  • 在 C# 中确定会话变量为 null 或空的最佳方法是什么?

    检查 ASP NET C 中会话变量是否存在的最佳方法是什么 我喜欢用String IsNullOrEmpty 适用于字符串 想知道是否有类似的方法Session 目前我知道的唯一方法是 var session if Session var
  • Finder 窗口刷新问题(Yosemite)

    我正在开发 Finder Sync 扩展以在文件和文件夹上应用徽章 我想刷新 Finder 应用程序中特定文件 文件夹的图标 有没有办法在 mac OS Yosemite 上以编程方式刷新查找器窗口 除了创建和删除文件 我也有这个问题 我曾
  • 用pointfree风格写f?

    说我有功能 g a gt b h a gt c and f b gt c gt d 函数可以写吗 f a gt a gt d 给出的 f x y f g x h y 点自由风格 可以写一个函数 f a gt d f x f g x h x
  • imul 指令的 ZF 行为是什么? [复制]

    这个问题在这里已经有答案了 指令集参考指出 imul 指令的 ZF 未定义 那么 如果我将寄存器中的值乘以立即数 0x0 ZF 会发生什么情况 未定义意味着结果可以是任何值 并且任何值都不重要
  • 使用 Tortoise SVN 通过 VPN 进行 SVN+SSH 结账,Smartsvn 失败

    系统和连接详细信息 我使用的是运行 Windows 7 的 64 位系统 我安装了 Open VPN 和 Tortoise SVN 64 位 该存储库位于远程系统中 我们使用 VPN 进行连接 到目前为止我做了什么 我已按照必要的步骤启动
  • Firestore 将值添加到数组字段

    我尝试使用 Firebase 云函数将聊天室的 id 添加到数组字段中的用户文档中 我似乎无法弄清楚写入数组字段类型的方法 这是我的云函数 exports updateMessages functions firestore documen
  • 仅返回 LEFT JOIN 的最新结果[重复]

    这个问题在这里已经有答案了 我正在查询两个表 students2014 和notes2014 中的数据 以便返回学生列表以及每个学生的注释 为此 我使用以下 select 语句 SELECT FROM students2014 LEFT J
  • Qt vtable错误

    我正在浏览旧的 Trolltech Qt 教程 因为我发现它们比新的教程更有帮助 并且undefined reference to vtable当我到达一个实现它自己的信号的类小部件时 我遇到了错误 http doc trolltech c
  • jquery 如何删除第一个 x div 的?

    如果我单击按钮 我会尝试删除前 4 个 div div class test div class 1 div div class 1 div div class 1 div div class 1 div div class 1 div d
  • 在 tkinter 上清除并绘制 matplotlib 图形

    我当前的代码需要一些帮助 我想通过 tkinter 创建一个窗口 并在我之前通过 matplotlib 创建的画布中显示一个绘图 这一点我还没有达到 我的问题是我想通过点击按钮来清除画布 为了清除画布 我想先初始化它 然后才能用绘图填充它
  • 具有通用返回类型但不具有通用输入的方法。这可能吗?

    假设我们有一个NodeData class public class NodeData
  • Facebook 图形 API 响应大小限制(错误代码 1)

    只是分享我在测试我的应用程序时遇到的一些信息 Facebook Graph API 实现了速率限制 如其上所述文档页 https developers facebook com docs graph api advanced rate li
  • 在 C# 中解析 html 的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将绘图添加到 matplotlib 中的给定图形

    我在代码的一部分中创建了一个图形 如下所示 n arange 51 fig3 plt figure plt semilogy n a1mag ro 现在 我想在代码的后面部分向该图添加另一个绘图 有没有办法在绘图时访问Fig3 建议完全保留
  • 将文件上传到 Dropbox 中的特定文件夹

    我使用此示例将文件上传到保管箱 https github com geersch DropboxRESTApi blob master src part 5 README md https github com geersch Dropbo
  • 使用 sha256WithRSAEncryption 进行签名需要什么版本的 OpenSSL

    使用 PHP 5 2 4 和 OpenSSL 0 9 8g 模块我试图创建一个签名摘要 openssl sign stuff signeddigest key sha256WithRSAEncryption 唉 signeddigest 返
  • 如何设置选择标签的选项元素的样式?

    我正在尝试设置一个的风格option in a selectGoogle Chrome 中的下拉菜单 它适用于除 IE9 和 Chrome 之外的所有浏览器 option red background color cc0000 font w
  • Perl regex /o 优化还是错误?

    我正在读perldoc perlre并注意到这句有点有趣的台词 o pretend to optimize your code but actually introduce bugs 我搜索了文档的其余部分 但没有找到对提到的 错误 的另一
  • 如何在 flutter App 上叠加一个小部件?

    我想要一个位于整个应用程序之上的小部件 当我尝试这样做时Overlay of context insert替换该路线后 覆盖层随后会消失 有没有办法在我的应用程序顶部添加一个小部件 即使屏幕稍后弹出 也许存在更优化的方式 但作为一个选项 这