Flutter悬浮UI的设计Overlay组件

这篇具有很好参考价值的文章主要介绍了Flutter悬浮UI的设计Overlay组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

APP开发经常要遇到的开发场景

有时候我们在开发APP的时候会遇到下面这些需求:

  • 在现有页面上添加浮动的悬浮按钮、气泡或菜单。
  • 实现全局的通知或提示弹窗。
  • 创建自定义的导航栏、底部导航或标签栏。
  • 构建模态对话框或底部弹出菜单。
  • 在屏幕上展示悬浮窗,比如 Flutter 版本的 Toast,任意位置的 PopWindow 等等。
  • 自定义Toast。
  • 在页面顶部悬浮某个widget。
    等等。
    这些场景都有一个共同特点,需要在当前UI上悬浮显示特定的UI。要用flutter来实现这些效果就要引出今天要学习的Overlay组件。

Overlay 的介绍

当需要在 Flutter 应用中在现有 UI 层上添加新的视图或交互时,可以使用 Overlay 组件。Overlay 允许将一个或多个小部件(称为 OverlayEntry)叠加在应用的现有 UI 上。
Overlay包括两个基本组件:OverlayState和OverlayEntry。OverlayState管理所有OverlayEntry,OverlayEntry定义覆盖层的内容。

Overlay的使用规则

  • 创建一个 Overlay 对象,通常使用 Overlay.of(context) 方法获取当前上下文中的 Overlay 对象。
  • 创建一个或多个 OverlayEntry 对象,这些对象将成为 Overlay 的子项。
  • 将 OverlayEntry 添加到 Overlay 中,通常使用 OverlayEntry 的 insert 或 add 方法。
  • 当需要显示或隐藏叠加层时,调用 OverlayEntry 的 markNeedsBuild 方法,并在 build 方法中定义要显示的小部件。
    可选:通过调整 OverlayEntry 的位置、大小和布局参数来控制叠加层的位置和样式。

举例说明

下面通过一个简单的例子来说明:例子要实现点击一个按钮会打开Overlay显示一个FloatingActionButton。

源码

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Overlay Example'),
        ),
        body: Center(
          child: ElevatedButton(
            child: Text('Open Overlay'),
            onPressed: () {
              showFloatingButtonOverlay(context);
            },
          ),
        ),
      ),
    );
  }
}

void showFloatingButtonOverlay(BuildContext context) {
  OverlayState? overlayState = Overlay.of(context);
  late OverlayEntry overlayEntry;

  // 创建 OverlayEntry
  overlayEntry = OverlayEntry(
    builder: (BuildContext context) {
      return Positioned(
        top: 100,
        right: 16,
        child: FloatingActionButton(
          onPressed: () {
            // 悬浮按钮被点击
            print('Floating Button Clicked');
            overlayEntry.remove(); // 移除 OverlayEntry
          },
          child: Icon(Icons.add),
        ),
      );
    },
  );

  // 将 OverlayEntry 添加到 Overlay 中
  overlayState?.insert(overlayEntry);
}

运行结果如图:

例子报错

本来想直接贴正确的代码的,但是觉得这个错误对初学者来说很容易犯,故单独列出来。

报错No Overlay widget found

点击Open Overlay按钮报错No Overlay widget found。如下图
Flutter悬浮UI的设计Overlay组件

报错原因

该错误提示是因为在使用 Overlay.of(context) 方法时,找不到可用的 Overlay 对象。

解决方法

确保按钮所在的 BuildContext 对象正确。在上述示例中,按钮的 onPressed 回调中使用的 BuildContext 应该是 Scaffold 的上下文,确保按钮在正确的上下文中定义和使用。

确保 Overlay 被正确地放置在应用的组件树中。在上述示例中,Overlay 组件应该在 MaterialApp 或 WidgetsApp 的下方,以确保它们在正确的层次结构中。

修改后的源码

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: OverlayExample(), // 使用 OverlayExample 作为主页
    );
  }
}

class OverlayExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Overlay Example'),
      ),
      body: Center(
        child: ElevatedButton(
          child: Text('Open Overlay'),
          onPressed: () {
            showFloatingButtonOverlay(context);
          },
        ),
      ),
    );
  }
}

void showFloatingButtonOverlay(BuildContext context) {
  OverlayState? overlayState = Overlay.of(context);
  late OverlayEntry overlayEntry;

  // 创建 OverlayEntry
  overlayEntry = OverlayEntry(
    builder: (BuildContext context) {
      return Positioned(
        top: 100,
        right: 16,
        child: FloatingActionButton(
          onPressed: () {
            // 悬浮按钮被点击
            print('Floating Button Clicked');
            overlayEntry.remove(); // 移除 OverlayEntry
          },
          child: Icon(Icons.add),
        ),
      );
    },
  );

  // 将 OverlayEntry 添加到 Overlay 中
  overlayState?.insert(overlayEntry);
}

例子效果

运行起来的效果如图:
Flutter悬浮UI的设计Overlay组件
点击Open Overlay按钮后的效果图如下:
Flutter悬浮UI的设计Overlay组件

总结

在Flutter中,Overlay(叠加层)是一种特殊的控件,它可以在页面的顶部显示另一个独立的层级。Overlay通常用于在页面上显示浮动的元素,例如悬浮按钮、对话框、通知等。下面是对Flutter中Overlay控件的总结:

  • Overlay Widget(叠加层控件):
    Flutter中的Overlay控件是一个Widget,它用于创建和管理叠加层。它本身不可见,但可以包含多个可见的OverlayEntry。

  • OverlayEntry(叠加层条目):
    OverlayEntry是Overlay中的条目,它代表了要在叠加层上显示的内容。每个OverlayEntry都可以包含一个Widget,并定义了在叠加层上的位置和大小。

  • OverlayState(叠加层状态):
    OverlayState是与Overlay关联的状态对象,它用于添加、移除和管理OverlayEntry。可以通过BuildContext的方法来获取OverlayState对象。

  • 添加和移除OverlayEntry:
    使用OverlayState对象的方法,可以将OverlayEntry添加到Overlay中,并通过调用remove方法将其从Overlay中移除。

  • OverlayEntry的位置和大小:
    OverlayEntry可以通过设置Positioned或Align等控件来确定其在叠加层上的位置和大小。可以使用top、bottom、left、right等属性来定位OverlayEntry。

在页面上显示悬浮按钮、提示框、通知等浮动元素。
创建全局的可见元素,例如全局加载指示器、底部导航栏等。
实现页面过渡动画效果,例如页面切换时的渐隐渐显效果。

Flutter中的Overlay控件是一种用于创建和管理叠加层的特殊控件。它通过OverlayState来添加和移除OverlayEntry,每个OverlayEntry可以包含一个Widget,并通过定位控件设置其位置和大小。Overlay常用于显示浮动的元素、创建全局可见元素和实现页面过渡动画效果。文章来源地址https://www.toymoban.com/news/detail-490214.html

到了这里,关于Flutter悬浮UI的设计Overlay组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 12-2_Qt 5.9 C++开发指南_自定义Qt Designer 插件(UI 设计器自定义界面组件的 Widget 插件,直接安装到 UI设计器组件面板里,如同 Qt 自带的界面设计组件一样)

    上篇使用提升法(promotion)来创建自定义组件,本篇为 UI 设计器设计自定义界面组件的 Widget 插件,直接安装到 UI设计器的组件面板里,如同 Qt 自带的界面设计组件一样使用,在设计时就能看到组件的实际显示效果,只是编译和运行时需要使用到插件的动态链接库 (Windows 平台上

    2024年02月05日
    浏览(56)
  • Flutter Overlay 你用上了么

    Flutter中的Overlay是一个用于在屏幕上显示浮层的组件。它可以用来在应用程序中创建弹出窗口、提示框、菜单、对话框等等。 Overlay通常用于在用户与应用程序交互时显示临时性的UI元素,例如:用户点击按钮时显示下拉菜单、用户长按屏幕时显示上下文菜单、显示警告或错误

    2024年02月07日
    浏览(56)
  • Flutter 插件开发遇到的问题及解决方案

    本文主要对笔者flutter插件开发过程中如下问题做了解决。 一、Flutter插件android模块中的代码报红问题解决 二、Flutter Plugin 开发中引入本地 aar 包报错的问题。 三、Flutter插件项目中获取到 Activity 1、在开发Flutter插件时,打开插件的android项目,准备编写native端的代码时,发现各

    2024年02月20日
    浏览(48)
  • eclipse中经常遇到的maven相关的问题

    maven工程依赖的jar包无法部署到tomcat中 右键maven工程,选择“属性”   将工程在tomcat重新发布即可。 2、Update Project or use Quick Fix maven工程总是提示更新,一更新java版本又回到1.5 在pom.xml添加如下:

    2024年02月16日
    浏览(42)
  • Flutter开发笔记:Flutter 布局相关组件

    Flutter开发笔记 Flutter 布局与布局组件 - 文章信息 - Author: Jack Lee (jcLee95) Visit me at: https://jclee95.blog.csdn.net Email: 291148484@163.com. Shenzhen China Address of this article: https://blog.csdn.net/qq_28550263/article/details/131419782 【介绍】:本文介绍Flutter 布局相关组件。 Flutter 中提供了丰富的原生布局组

    2024年02月11日
    浏览(56)
  • Flutter开发③——组件

    目录 Container容器组件 decoration属性  padding和maring属性 transform属性 Text组件  TextStyle参数 图片组件 Container实现圆形图片  ClipOval实现圆形图片  加载本地图片  图标组件 自带的Icons图标 借助阿里巴巴图标库自定义字体图标 ListView列表组件 垂直列表 水平列表 可左右滑动  动态

    2024年02月03日
    浏览(43)
  • Flutter 实现安卓原生系统级悬浮窗

    Flutter实现安卓原生系统级悬浮窗 原创:@As.Kai 博客地址:https://blog.csdn.net/qq_42362997 如果以下内容对您有帮助,点赞点赞点赞~ 最近碰到了一个需求 使用Flutter实现悬浮窗效果 想来想去只能使用原生代码实现 需求整理: 应用移动到后台 - 显示系统级悬浮窗口 应用移动到前台

    2023年04月08日
    浏览(67)
  • 组件开发遇到的问题(vue的问题)

    组件的开发和引用 当我们将项目中公用的块,或者页面中多处样式一样,只是数据展示不同的地方抽取出一个个公用组件时,可以提高我们的开发效率,避免重复的工作,只需要在不同的页面引入公用的组件即可。创建一个viewMore.vue文件,定义一个组件块。 这样就可以在其

    2024年01月20日
    浏览(42)
  • Flutter 项目添加 IOS 小组件开发记录

    突然接到一个需求,需要我们在 IOS APP 中添加 widget 小组件,用来展示项目项目数据信息。大领导的需求没法拒绝,只能摸着石头过河,开干! 由于项目用的是 Flutter 来搭建的,所以需要申请台 mac 电脑安装一遍开发环境。具体的准备我之前写过一篇 前端角度快速理解 Flutt

    2024年04月25日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包