import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/screen_util.dart'; import '../components/commonFun.dart'; //int my_count = 0; //重试次数 class MyDelayToast { int showTime; // MyDelayToast显示时间 double top; double left; double width; double height; OverlayEntry _overlayEntry; // MyDelayToast靠它加到屏幕上 Timer _timer; double minEdge = 2.5; MyDelayToast( {@required BuildContext context, this.showTime = 5, this.top = 100, this.left = 20, this.width = 80, this.height = 50}) { OverlayState overlayState = Overlay.of(context); startTimer(); if (_overlayEntry == null) { _overlayEntry = OverlayEntry( builder: (BuildContext context) { return Positioned( top: top, left: left, child: Draggable( child: getView(context), feedback: getView(context), onDragStarted: () { print('onDragStarted:'); }, // onDragEnd: (detail) { // print('onDragEnd:${detail.offset}'); // getView(top: detail.offset.dy, left: detail.offset.dx); // }, onDraggableCanceled: (Velocity velocity, Offset _offset) { //ScreenUtil().statusBarHeight //Top Status bar height , Notch will be higher //ScreenUtil().bottomBarHeight //Bottom safe zone distance, suitable for buttons with full screen top = _offset.dy <= ScreenUtil().statusBarHeight ? ScreenUtil().statusBarHeight + minEdge : (_offset.dy < ScreenUtil().screenHeight - height - ScreenUtil().bottomBarHeight) ? _offset.dy : (ScreenUtil().screenHeight - height - ScreenUtil().bottomBarHeight - minEdge); left = _offset.dx < minEdge ? minEdge : (_offset.dx < ScreenUtil().screenWidth - width - minEdge) ? _offset.dx : (ScreenUtil().screenWidth - width - minEdge); getView(context); _overlayEntry.markNeedsBuild(); }, childWhenDragging: Container(), ), ); }, ); overlayState.insert(_overlayEntry); } else { //重新绘制UI,类似setState _overlayEntry.markNeedsBuild(); } } Widget getView(BuildContext context, {double width = 80, double height = 50}) { return GestureDetector( child: Container( width: width, height: height, padding: EdgeInsets.all(0), color: Theme.of(context).buttonColor, child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [ Text('第 ${getCount} 次获取 ', style: TextStyle( fontFamily: Theme.of(context).accentTextTheme.caption.fontFamily, fontSize: 13, color: Colors.black, decoration: TextDecoration.none, fontWeight: FontWeight.normal, ), textAlign: TextAlign.center), Text('(${showTime} 秒)', style: TextStyle( fontFamily: Theme.of(context).accentTextTheme.caption.fontFamily, fontSize: 13, color: Colors.black, decoration: TextDecoration.none, fontWeight: FontWeight.normal, ), textAlign: TextAlign.center), ]), ), onTap: () {}, onDoubleTap: () { endMyDelayToast(); }, onLongPress: () { endMyDelayToast(); }, ); } endMyDelayToast() async { _timer?.cancel(); _overlayEntry.markNeedsBuild(); await Future.delayed(Duration(milliseconds: 400)); _overlayEntry.remove(); _overlayEntry = null; } void startTimer() { _timer = Timer.periodic( Duration(seconds: 1), (Timer timer) { if (showTime < 1) { timer.cancel(); endMyDelayToast(); } else { if (!getingDwVideo) { endMyDelayToast(); } showTime--; // if (showTime % 3 == 0) { // getCount++; // } _overlayEntry.markNeedsBuild(); } }, ); } }