雖然fluttertoast很好用,還是決定自定義一個(gè),畢竟產(chǎn)品經(jīng)常需要,黑點(diǎn),亮點(diǎn),大點(diǎn)小店,帶點(diǎn)圖片的......需求,如果需要圖片等特殊效果,該下UI即可
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class ToastUtils {
static OverlayEntry _overlayEntry; // toast靠它加到屏幕上
static bool _showing = false; // toast是否正在showing
static DateTime _startedTime; // 開(kāi)啟一個(gè)新toast的當(dāng)前時(shí)間菩彬,用于對(duì)比是否已經(jīng)展示了足夠時(shí)間
static String _msg; // 提示內(nèi)容
static int _showTime; // toast顯示時(shí)間
static Color _bgColor; // 背景顏色
static Color _textColor; // 文本顏色
static double _textSize; // 文字大小
static String _toastPosition; // 顯示位置
static double _pdHorizontal; // 左右邊距
static double _pdVertical; // 上下邊距
static void toast(
BuildContext context, {
String msg,
int showTime = 2000,
Color bgColor = Colors.black,
Color textColor = Colors.white,
double textSize = 14.0,
String position = 'center',
double pdHorizontal = 20.0,
double pdVertical = 10.0,
}) async {
assert(msg != null);
_msg = msg;
_startedTime = DateTime.now();
_showTime = showTime;
_bgColor = bgColor;
_textColor = textColor;
_textSize = textSize;
_toastPosition = position;
_pdHorizontal = pdHorizontal;
_pdVertical = pdVertical;
//獲取OverlayState
OverlayState overlayState = Overlay.of(context);
_showing = true;
if (_overlayEntry == null) {
_overlayEntry = OverlayEntry(
builder: (BuildContext context) => Positioned(
//top值铸鹰,可以改變這個(gè)值來(lái)改變toast在屏幕中的位置
top: _calToastPosition(context),
child: Container(
alignment: Alignment.center,
width: MediaQuery.of(context).size.width,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 40.0),
child: AnimatedOpacity(
opacity: _showing ? 1.0 : 0.0, //目標(biāo)透明度
duration: _showing
? Duration(milliseconds: 100)
: Duration(milliseconds: 400),
child: _buildToastWidget(),
),
)),
));
overlayState.insert(_overlayEntry);
} else {
//重新繪制UI簸喂,類似setState
_overlayEntry.markNeedsBuild();
}
await Future.delayed(Duration(milliseconds: _showTime)); // 等待時(shí)間
//2秒后 到底消失不消失
if (DateTime.now().difference(_startedTime).inMilliseconds >= _showTime) {
_showing = false;
_overlayEntry.markNeedsBuild();
await Future.delayed(Duration(milliseconds: 400));
_overlayEntry.remove();
_overlayEntry = null;
}
}
//toast繪制
static _buildToastWidget() {
return Center(
child: Card(
color: _bgColor,
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: _pdHorizontal, vertical: _pdVertical),
child: Text(
_msg,
style: TextStyle(
fontSize: _textSize,
color: _textColor,
),
),
),
),
);
}
// 設(shè)置toast位置
static _calToastPosition(context) {
var backResult;
if (_toastPosition == 'top') {
backResult = MediaQuery.of(context).size.height * 1 / 4;
} else if (_toastPosition == 'center') {
backResult = MediaQuery.of(context).size.height * 2 / 5;
} else {
backResult = MediaQuery.of(context).size.height * 3 / 4;
}
return backResult;
}
}
image
喜歡可以加Q群號(hào):913934649,點(diǎn)贊,評(píng)論;
簡(jiǎn)書(shū): http://www.reibang.com/u/88db5f15770d