方法一

  Offset _offset = Offset.zero;Scaffold(body: Stack(children: [_pageList[_currentIndex],Positioned(left: _offset.dx,top: _offset.dy,child: GestureDetector(onPanUpdate: (d) =>setState(() => _offset += Offset(d.delta.dx, d.delta.dy)),child: FloatingActionButton(onPressed: () {},backgroundColor: Colors.orange,child: Icon(Icons.add),),),),],),

方法二

 WidgetsBinding.instance.addPostFrameCallback((_) => _insertOverlay(context));
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),),),),);}),);}

方法三

1.场景 现在需要做一个Test按钮,悬浮在所有页面之上,并且可以拖拽。

2.思路 1)悬浮按钮可以使用flutter提供的Overlay + OverlayEntry 组合实现

2)拖拽功能可以使用GestureDetector手势按钮或者Draggable实现(PS:我做了一版Draggable实现的,但是发现它会有原本的widget浮在原地,显然不是我要的效果)

3)点击的时候我是让它弹出一个底部弹框,这里你们可以自由发挥,本篇文章不做多余赘述

PubScaffold(child: MaterialApp(theme: CustomTheme.lightTheme,darkTheme: CustomTheme.darkTheme,themeMode: currentTheme.currentTheme,home: Scaffold(body: Stack(children: [_pageList[_currentIndex],// Positioned(//   left: _offset.dx,//   top: _offset.dy,//   child: GestureDetector(//     onPanUpdate: (d) =>//         setState(() => _offset += Offset(d.delta.dx, d.delta.dy)),//     child: FloatingActionButton(//       onPressed: () {},//       backgroundColor: Colors.orange,//       child: Icon(Icons.add),//     ),//   ),// ),],),bottomNavigationBar: CurvedNavigationBar(// key: _bottomNavigationKey,index: 0,height: 60.0,items: <Widget>[Icon(Icons.home, size: 30),Icon(Icons.list, size: 30),Icon(Icons.compare_arrows, size: 30),// Icon(Icons.call_split, size: 30),],color: Colors.white,buttonBackgroundColor: Colors.white,backgroundColor: Colors.blueAccent,animationCurve: Curves.easeInOut,animationDuration: Duration(milliseconds: 600),onTap: (index) {setState(() {_currentIndex = index;});},// letIndexChange: (index) => true,),),),);

这里的PubScaffold就是我封装的一个悬浮按钮组件,把它包裹在MaterialApp外面,就可以实现悬浮在所有的组件之上的一个按钮啦(当然也可以不是按钮,具体样式可以自己定义)。下面我们来看一下PubScaffold中的代码吧~

import 'dart:math';import 'package:flutter/material.dart';class PubScaffold extends StatefulWidget {final Widget child;PubScaffold({this.child});@override_PubScaffoldState createState() => _PubScaffoldState();
}class _PubScaffoldState extends State<PubScaffold> {bool draggable = false;//静止状态下的offsetOffset idleOffset = Offset(0, 0);//本次移动的offsetOffset moveOffset = Offset(0, 0);//最后一次down事件的offsetOffset lastStartOffset = Offset(0, 0);int count = 0;final List<String> testWidgetList = ['测试1','测试2',];testAppFun(e) {// TODO: 你的代码逻辑}// 显示一个底部弹窗,这里是一个测试列表showTestList() {showModalBottomSheet(context: context,enableDrag: false,shape: RoundedRectangleBorder(borderRadius: BorderRadius.only(topLeft: Radius.circular(20.0),topRight: Radius.circular(20.0),),),builder: (BuildContext context) {return ListView(children: testWidgetList.map((e) => Container(decoration: BoxDecoration(border: Border(bottom: BorderSide(color: Color(0xFFe3e3e3)),),),child: ListTile(onTap: () => testAppFun(e),title: Text(e),),),).toList(),);},);}@overrideWidget build(BuildContext context) {return LayoutBuilder(builder: (context, constraints) {// 显示悬浮按钮WidgetsBinding.instance.addPostFrameCallback((_) => _insertOverlay(context));return widget.child;},);}// 悬浮按钮,可以拖拽(可自定义样式)void _insertOverlay(BuildContext context) {return Overlay.of(context).insert(OverlayEntry(builder: (context) {final size = MediaQuery.of(context).size;print(size.width);return Positioned(top: draggable ? moveOffset.dy : size.height - 102,left: draggable ? moveOffset.dx : size.width - 72,child: GestureDetector(// 移动开始onPanStart: (DragStartDetails details) {setState(() {lastStartOffset = details.globalPosition;draggable = true;});if (count <= 1) {count++;}},// 移动中onPanUpdate: (DragUpdateDetails details) {setState(() {moveOffset =details.globalPosition - lastStartOffset + idleOffset;if (count > 1) {moveOffset = Offset(max(0, moveOffset.dx), moveOffset.dy);} else {moveOffset = Offset(max(0, moveOffset.dx + (size.width - 72)),moveOffset.dy + (size.height - 102));}});},// 移动结束onPanEnd: (DragEndDetails detail) {setState(() {idleOffset = moveOffset * 1;});},child: TestContainer(onPress: () => showTestList(),),),);}),);}
}// 悬浮按钮的样式
class TestContainer extends StatelessWidget {final Function onPress;TestContainer({this.onPress});@overrideWidget build(BuildContext context) {return Material(color: Colors.transparent,child: GestureDetector(onTap: onPress,child: Container(width: 56,height: 56,alignment: Alignment.center,decoration: BoxDecoration(shape: BoxShape.circle,color: Colors.green[600],),child: Text("Test",style: TextStyle(color: Colors.white,fontWeight: FontWeight.bold,),),),),);}
}

1.全局悬浮按钮

这里我们用的是flutter自带的material库中的Overlay组件,具体使用方法如下:

void _insertOverlay(BuildContext context) {return Overlay.of(context).insert(OverlayEntry(builder: (context) {final size = MediaQuery.of(context).size;print(size.width);return Positioned(top: draggable ? moveOffset.dy : size.height - 102,left: draggable ? moveOffset.dx : size.width - 72,child: GestureDetector(// 移动开始onPanStart: (DragStartDetails details) {setState(() {lastStartOffset = details.globalPosition;draggable = true;});if (count <= 1) {count++;}},// 移动中onPanUpdate: (DragUpdateDetails details) {setState(() {moveOffset =details.globalPosition - lastStartOffset + idleOffset;if (count > 1) {moveOffset = Offset(max(0, moveOffset.dx), moveOffset.dy);} else {moveOffset = Offset(max(0, moveOffset.dx + (size.width - 72)),moveOffset.dy + (size.height - 102));}});},// 移动结束onPanEnd: (DragEndDetails detail) {setState(() {idleOffset = moveOffset * 1;});},child: TestContainer(onPress: () => showTestList(),),),);}),);}

Flutter全局悬浮按钮相关推荐

  1. iOS全局悬浮按钮+浮框

    效果图 库代码 Github地址 应用 悬浮按钮可以用于展示特定的信息 按钮有点击拖动等事件回调,可以自行扩展功能 示例中,浮框利用响应链框选View 可以拖动回调坐标,获取手势处View,进一步展示 ...

  2. iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch

    前提:当时看到别人写过这个类似AssistiveTouch的demo,但是有问题,第一改变不了位置.第二切换页面后无法使用.第三运行时偶尔会崩溃.然后自己就去度娘.论坛中都查了一些资料,然后结合起来写 ...

  3. ios添加全局悬浮按钮_iOS开发悬浮按钮

    释放双眼,带上耳机,听听看~! #import "ViewController.h"@interface ViewController ()@property (weak, non ...

  4. Android 全局悬浮按钮,悬浮按钮点击事件

    实现效果: 实现方法: 在自定义baseActivity里面添加viwe即可.在子activity里刷新悬浮View即可 public abstract class BaseActivity exte ...

  5. Flutter 悬浮按钮 FloatingActionButton 的详细配置使用

    志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的 ...

  6. flutter 拖拽布局_使用Flutter模仿SOUL可任意拖动的悬浮按钮

    在Flutter中,我们可以两种方式实现小部件对拖动效果 GestureDetector() Draggable() GestureDetector 在开发过程中经常使用到GestureDetecto ...

  7. Flutter悬浮按钮FloatingActionButton使用详解

    1.普通用法 1 2 3 4 5 6 floatingActionButton: FloatingActionButton(     child: Icon(Icons.add),       onP ...

  8. flutter初学之悬浮按钮

    期望:想实现一个悬浮在整个页面的悬浮按钮: 实现1(用FloatingActionButton实现): // 新增悬浮按钮 Widget _createFixedAddWidget(ProductEn ...

  9. 返回按钮悬浮(类似手机的悬浮按钮)

    效果图 (可以进行随意拖动悬浮按钮) 废话不多说,看代码 <div id="container" style="height: 100px;">&l ...

最新文章

  1. java Random.nextInt()方法
  2. Linux下使用Speedtest测试网速教程
  3. vulnhub_内网渗透测试的记录——网络安全
  4. CSU - 2059 Water Problem(Z线分割平面)
  5. oracle表对比同步,Oracle表双向同步问题
  6. 我的天!我靠这个拥有了自己第一架无人机!
  7. Android 中View仅仅能接收到ACTION_DOWN无法接收ACTION_MOVE和ACTION_UP解决的方法
  8. kindlefire刷安卓系统_Kindle Fire平板刷入原生Android 4.0系统教程
  9. 嵌入式c语言小学期实验报告,小学期单片机实验报告.doc
  10. MS08067 “安全练兵场”战术空袭~
  11. 在Ubuntu中安装LiteIDE
  12. VLIW技术与嵌入式系统
  13. access中本年度的四月一日_2014年3月计算机二级ACCESS上机试题及详解十二
  14. 月薪15k的软件测试工程师需要学习什么技术?
  15. 面试记录-苏宁(客服研发中心)
  16. [硬件]电路-TTL
  17. Co-training 初探快切入
  18. 【安卓10修改系统文件】安卓10修改系统文件hosts
  19. 计算机一级考试实训在线做,程序设计能力 在线实训系统
  20. Java安全--CC1的补充和CC6

热门文章

  1. 微服务架构方案 springBoot+dubbo
  2. 快捷键截屏_关于Mac电脑截图,你必须要知道的几个快捷键!(错过会后悔哦)...
  3. python爬取音乐并保存_python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
  4. 多目标机器学习_NIPS2018 - 用多目标优化解决多任务学习
  5. linux启动lsyncd服务,Ubuntu下lsyncd实现远端实时同步配置
  6. Linux清空文件内容的三种方法
  7. 多头注意力机制的理解
  8. svm常用核函数及选择核函数的方法
  9. 需要正则化的一个判断
  10. linux中没有semanagea安装包,如何使用semanage管理SELinux安全策略