flutter自定义弹窗_app加弹窗

2022-11-08 16:27:37 浏览数 (2)

大家好,又见面了,我是你们的朋友全栈君。

一.Flutter toast库配置,可参考fluttertoast配置引用

1.在pubspec.yaml中配置fluttertoast库,通过Pub get 获取fluttertoast的版本,通过Pub upgrade更新,eg:

代码语言:javascript复制
 # 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:

代码语言:javascript复制
import 'package:fluttertoast/fluttertoast.dart';

3.fluttertoast.dart源码查看

代码语言:javascript复制
/// 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:

代码语言:javascript复制
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:

代码语言:javascript复制
Fluttertoast.cancel()

二.自定义fluttertoast

1.定义FToast字段,eg:

代码语言:javascript复制
FToast fToast;

2.初始化定义的FToast,eg:

代码语言:javascript复制
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    fToast=FToast();
    fToast.init(context);
  }

3.定义FToast显示的方法,包括内容,布局,和显示时长,eg:

代码语言:javascript复制
_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

代码语言:javascript复制
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,
),
],
)
],
),
),
);
}
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

0 人点赞