Flutter toast弹窗实现
Posted 伟雪无痕
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter toast弹窗实现相关的知识,希望对你有一定的参考价值。
一.Flutter toast库配置,可参考fluttertoast配置引用
1.在pubspec.yaml中配置fluttertoast库,通过Pub get 获取fluttertoast的版本,通过Pub upgrade更新,eg:
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for ios style icons.
cupertino_icons: ^1.0.2
provider: ^5.0.0
fluttertoast: ^8.0.8
2.在需要显示toast的dart文件中,import fluttertoast.dart,eg:
import 'package:fluttertoast/fluttertoast.dart';
3.fluttertoast.dart源码查看
/// Summons the platform's showToast which will display the message
///
/// Wraps the platform's native Toast for android.
/// Wraps the Plugin https://github.com/scalessec/Toast for iOS
/// Wraps the https://github.com/apvarun/toastify-js for Web
///
/// Parameter [msg] is required and all remaining are optional
static Future<bool?> showToast(
required String msg,
Toast? toastLength,
int timeInSecForIosWeb = 1,
double? fontSize,
ToastGravity? gravity,
Color? backgroundColor,
Color? textColor,
bool webShowClose = false,
webBgColor: "linear-gradient(to right, #00b09b, #96c93d)",
webPosition: "right",
) async
String toast = "short";
if (toastLength == Toast.LENGTH_LONG)
toast = "long";
String gravityToast = "bottom";
if (gravity == ToastGravity.TOP)
gravityToast = "top";
else if (gravity == ToastGravity.CENTER)
gravityToast = "center";
else
gravityToast = "bottom";
//lines from 78 to 97 have been changed in order to solve issue #328
if (backgroundColor == null)
backgroundColor = Colors.black;
if (textColor == null)
textColor = Colors.white;
final Map<String, dynamic> params = <String, dynamic>
'msg': msg,
'length': toast,
'time': timeInSecForIosWeb,
'gravity': gravityToast,
'bgcolor': backgroundColor != null ? backgroundColor.value : null,
'iosBgcolor': backgroundColor != null ? backgroundColor.value : null,
'textcolor': textColor != null ? textColor.value : null,
'iosTextcolor': textColor != null ? textColor.value : null,
'fontSize': fontSize,
'webShowClose': webShowClose,
'webBgColor': webBgColor,
'webPosition': webPosition
;
bool? res = await _channel.invokeMethod('showToast', params);
return res;
1).默认值设置,eg:
property | description | default |
---|---|---|
msg | String (Not Null)(required) | required |
toastLength | Toast.LENGTH_SHORT or Toast.LENGTH_LONG (optional) | Toast.LENGTH_SHORT |
gravity | ToastGravity.TOP (or) ToastGravity.CENTER (or) ToastGravity.BOTTOM (Web Only supports top, bottom) | ToastGravity.BOTTOM |
timeInSecForIosWeb | int (for ios & web) | 1 (sec) |
backgroundColor | Colors.red | null |
textcolor | Colors.white | null |
fontSize | 16.0 (float) | null |
webShowClose | false (bool) | false |
webBgColor | String (hex Color) | linear-gradient(to right, #00b09b, #96c93d) |
webPosition | String (left , center or right ) | right |
4.在需要显示toast的dart文件中调用showToast()方法,eg:
Fluttertoast.showToast(
msg: "Dividend cannot be zero",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIosWeb: 1,
backgroundColor: Colors.white,
textColor: Colors.black,
fontSize: 18.0
);
5.取消toast,可调用 cancel(),eg:
Fluttertoast.cancel()
二.自定义fluttertoast
1.定义FToast字段,eg:
FToast fToast;
2.初始化定义的FToast,eg:
@override
void initState()
// TODO: implement initState
super.initState();
fToast=FToast();
fToast.init(context);
3.定义FToast显示的方法,包括内容,布局,和显示时长,eg:
_showToast()
Widget toast = Container(
padding: const EdgeInsets.symmetric(horizontal: 5.0, vertical: 5.0),
alignment: Alignment.center,
child: Row(
mainAxisSize: MainAxisSize.min,
children: const [
SizedBox(
width: 50.0,
),
Text(
"Dividend cannot be zero",
textAlign: TextAlign.center,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Colors.black,
backgroundColor: Colors.white,
fontSize: 18,
),
)
],
),
);
fToast.showToast(
child: toast,
gravity: ToastGravity.BOTTOM,
toastDuration: const Duration(seconds: 1),
);
// Custom Toast Position
fToast.showToast(
child: toast,
toastDuration: const Duration(seconds: 3),
positionedToastBuilder: (context, child)
return Positioned(
child: child,
top: 15.0,
left: 15.0,
);
);
4.调用,可在需要显示toast的地方直接调用_showToast()方法即可,eg:计算器简单实现中添加被除数不能为零的toast
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
// ignore: camel_case_types
class calculatePage extends StatefulWidget
const calculatePage(Key? key) : super(key: key);
@override
State createState() => calculatePageState();
// ignore: camel_case_types
class calculatePageState extends State<calculatePage>
var num1 = 0, num2 = 0, sum = 0;
late FToast fToast;
@override
void initState()
// TODO: implement initState
super.initState();
fToast=FToast();
fToast.init(context);
final TextEditingController text1 = TextEditingController(text: "0");
final TextEditingController text2 = TextEditingController(text: "0");
void doAddition()
setState(()
print("doAddition---begin");
num1 = int.parse(text1.text);
num2 = int.parse(text2.text);
sum = num1 + num2;
);
void doSub()
setState(()
// ignore: avoid_print
print("doSub---begin");
num1 = int.parse(text1.text);
num2 = int.parse(text2.text);
sum = num1 - num2;
);
void doMul()
setState(()
print("doSub---begin");
num1 = int.parse(text1.text);
num2 = int.parse(text2.text);
sum = num1 * num2;
);
void doDiv()
setState(()
// ignore: avoid_print
print("doSub---begin");
num1 = int.parse(text1.text);
num2 = int.parse(text2.text);
if(num2==0)
/*Fluttertoast.showToast(
msg: "Dividend cannot be zero",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIosWeb: 1,
backgroundColor: Colors.white,
textColor: Colors.black,
fontSize: 18.0
);*/
_showToast();
else
sum = num1 ~/ num2;
);
void doClear()
setState(()
print("doSub---begin");
text1.text = "0";
text2.text = "0";
sum=0;
);
_showToast()
Widget toast = Container(
padding: const EdgeInsets.symmetric(horizontal: 5.0, vertical: 5.0),
alignment: Alignment.center,
child: Row(
mainAxisSize: MainAxisSize.min,
children: const [
SizedBox(
width: 50.0,
),
Text(
"Dividend cannot be zero",
textAlign: TextAlign.center,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Colors.black,
backgroundColor: Colors.white,
fontSize: 18,
),
)
],
),
);
fToast.showToast(
child: toast,
gravity: ToastGravity.BOTTOM,
toastDuration: const Duration(seconds: 1),
);
// Custom Toast Position
fToast.showToast(
child: toast,
toastDuration: const Duration(seconds: 3),
positionedToastBuilder: (context, child)
return Positioned(
child: child,
top: 15.0,
left: 15.0,
);
);
@override
Widget build(BuildContext context)
print("build---begin");
return Scaffold(
appBar: AppBar(
title: const Text("calculatePage"),
),
body: Container(
padding: const EdgeInsets.all(45.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextField(
keyboardType: TextInputType.number,
decoration: const InputDecoration(hintText: "Please Enter Number one"),
controller: text1,
),
TextField(
keyboardType: TextInputType.number,
decoration: const InputDecoration(hintText: "Please Enter Number two"),
controller: text2,
),
const Padding(
padding: EdgeInsets.only(top: 18.0),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
"Calculate Output : $sum",
style: const TextStyle(
fontSize: 16.0,
fontWeight: FontWeight.bold,
color: Colors.orange),
),
],
),
const Padding(
padding: EdgeInsets.only(top: 18.0),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
MaterialButton(
child: const Text("+"),
color: Colors.greenAccent,
onPressed: doAddition,
),
MaterialButton(
child: const Text("-"),
color: Colors.greenAccent,
onPressed: doSub,
),
],
),
const Padding(
padding: EdgeInsets.only(top: 18.0),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
MaterialButton(
child: const Text("*"),
color: Colors.greenAccent,
onPressed: doMul,
),
MaterialButton(
child: const Text("/"),
color: Colors.greenAccent,
onPressed: doDiv,
),
],
),
const Padding(
padding: EdgeInsets.only(top: 18.0),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
MaterialButton(
child: const Text("Clear"),
color: Colors.red,
onPressed: doClear,
),
],
)
],
),
),
);
以上是关于Flutter toast弹窗实现的主要内容,如果未能解决你的问题,请参考以下文章
uniapp 原生Toast弹窗提示(可穿透所有界面) Ba-Toast
uniapp 原生Toast弹窗提示(可穿透所有界面) Ba-Toast