Flutter 弹框6种

1、Flutter 项目默认升级弹框和自定义升级弹框

注:在pubspec.yaml中添加 插件

#版本更新对话框

flutter_update_dialog: ^1.0.0

代码如下:

import 'dart:async';

import 'package:flutter/material.dart';

import 'package:flutter_update_dialog/flutter_update_dialog.dart';

///

/// 版本更新对话框

///

class MyUpdateDialog {

static UpdateDialogdialog;

static doubleprogress =0.0;

  ///默认样式

  static defaultStyle(BuildContext context) {

    if (dialog !=null &&dialog.isShowing()) {

        return;

    }

  dialog = UpdateDialog.showUpdate(context,

        title:"是否升级到4.1.4版本?",

        updateContent:"新版本大小:2.0M\n1.更新UI\n2.更新Bug\n3.增加新功能",

        onUpdate:onUpdate);

  }

///自定义样式

  static customStyle(BuildContext context) {

    if (dialog !=null &&dialog.isShowing()) {

        return;

    }

    dialog = UpdateDialog.showUpdate(context,

        width:250,

        title:"是否升级到4.1.4版本?",

        updateContent:"新版本大小:2.0M\n1.更新UI\n2.更新Bug\n3.增加新功能",

        titleTextSize:14,

        contentTextSize:12,

        buttonTextSize:12,

        topImage:Image.asset('assets/images/image_top.png'),

        extraHeight:5,

        radius:8,

        themeColor:Color(0xFFFFAC5D),

        progressBackgroundColor:Color(0x5AFFAC5D),

        isForce:true,

        updateButtonText:'升级',

        ignoreButtonText:'忽略此版本',

        enableIgnore:true, onIgnore: () {

        // ToastUtils.waring("忽略");

          dialog.dismiss();

    }, onUpdate:onUpdate);

  }

///更新方法

  static onUpdate() {

    // ToastUtils.success("开始升级...");

    Timer.periodic(Duration(milliseconds:50), (timer) {

      progress =progress +0.02;

      if (progress >1.0001) {

        timer.cancel();

        dialog.dismiss();

        progress =0;

        // ToastUtils.success("升级成功!");

      }else {

        dialog.update(progress);

      }

});

  }

}


调用:

///默认版本更新对话弹框

MyUpdateDialog.defaultStyle(context);

///自定义 版本更新对话弹框

MyUpdateDialog.customStyle(context);


2.从底部弹窗

代码如下:

AppTool   工具类

import 'package:flutter/cupertino.dart';

import 'package:flutter/material.dart';

import 'package:flutter/widgets.dart';

import 'package:flutter_app1/module/dialogs/widget/bottom_widget.dart';

import 'package:flutter_app1/module/dialogs/widget/center_dialog.dart';

import 'package:flutter_app1/module/dialogs/widget/define_widget.dart';

import 'package:flutter_app1/module/dialogs/widget/input_dialog.dart';

import 'package:flutter_app1/module/dialogs/widget/style_dialog.dart';

///

/// 自定义弹窗

///

///

class AppTool {

/// 底部弹出2个选项框

  showBottomAlert(BuildContext context, confirmCallback, String title,

      String option1, String option2) {

showCupertinoModalPopup(

context: context,

        builder: (context) {

return BottomCustomAlterWidget(

confirmCallback, title, option1, option2);

        });

  }

/// 中间弹出提示框

  showCenterTipsAlter(

BuildContext context, confirmCallback, String title, String desText) {

showDialog(

context: context,

        builder: (BuildContext context) {

return CenterTipsAlterWidget(confirmCallback, title, desText);

        });

  }

/// 中间弹出输入框

  showCenterInputAlert(

BuildContext context, confirmCallback, String title, String placeholder) {

showDialog(

context: context,

        builder: (BuildContext context) {

return ShowInputAlertWidget(confirmCallback, title, placeholder);

        });

  }

///自定义弹框

  showStyleAlert(BuildContext context, confirmCallback, String title,

      String contentTitle) {

showDialog(

context: context,

        builder: (BuildContext context) {

return StyleDialog(confirmCallback, title, contentTitle);

        });

  }

///只有一个确定按钮的弹窗

  showDefineAlert(

BuildContext context, confirmCallback, String title, String hintText) {

showDialog(

context: context,

        builder: (BuildContext context) {

return ShowDefineAlertWidget(confirmCallback, title, hintText);

        });

  }

}




底部弹窗Widget 

import 'package:flutter/cupertino.dart';

import 'package:flutter/widgets.dart';

///底部弹框

class BottomCustomAlterWidget extends StatefulWidget {

final confirmCallback;

  final title;

  final option1;

  final option2;

  const BottomCustomAlterWidget(this.confirmCallback, this.title, this.option1, this.option2);

  @override

     _BottomCustomAlterWidgetStatecreateState() =>

    _BottomCustomAlterWidgetState();

}

class _BottomCustomAlterWidgetStateextends State {

  final controller =TextEditingController();

  StringinputValuue ="";

  @override

  Widgetbuild(BuildContext context) {

return CupertinoActionSheet(

///底部弹出的提示框

      title:Text(

        widget.title,

        style:TextStyle(fontSize:22),

      ),

      actions: [

    CupertinoActionSheetAction(

    onPressed: () {

              Navigator.pop(context);

              widget.confirmCallback(widget.option1);

            },

            child:Text(widget.option1)),

        CupertinoActionSheetAction(

                onPressed: () {

                Navigator.pop(context);

                widget.confirmCallback(widget.option2);

            },

            child:Text(widget.option2)),

      ],

      cancelButton:CupertinoActionSheetAction(

        onPressed: () {

            Navigator.pop(context);

        },

        child:Text('取消'),

      ),

    );

  }

}

调用:

///从底部弹出弹框

AppTool().showBottomAlert(context, sexConfirmCallback, "请选择性别", '男', '女');


3、警告/提示弹框

警告/弹窗Widget    CenterTipsAlterWidget

import 'package:flutter/cupertino.dart';

import 'package:flutter/widgets.dart';

///

/// 提示弹框

///

class CenterTipsAlterWidget  extends StatefulWidget {

final confirmCallback;

  final title;

  final desText;

  const CenterTipsAlterWidget(this.confirmCallback, this.title, this.desText);

  @override

  _CenterTipsAlterWidgetStatecreateState() =>_CenterTipsAlterWidgetState();

}

class _CenterTipsAlterWidgetStateextends State {

@override

  Widgetbuild(BuildContext context) {

///警告对话框

    return CupertinoAlertDialog(

      title:Text(widget.title),

      content:Column(

          children: [

            SizedBox(

            height:10,

          ),

          Align(

            child:Text(widget.desText),

            alignment:Alignment(0, 0),

          )

        ],

      ),

      actions: [

            CupertinoDialogAction(

            child:Text('取消'),

              onPressed: () {

                    Navigator.pop(context);

          },

        ),

        CupertinoDialogAction(

          child:Text('确定'),

          onPressed: () {

            widget.confirmCallback('确定');

            Navigator.pop(context);

          },

        ),

      ],

    );

  }

}

调用:

///警告,提示对话框

AppTool().showCenterTipsAlter(context, centerConfirmCallback, "这是提示的标题", '这是提示的文本');


4.输入弹框

输入弹框Widget  ShowInputAlertWidget


import 'package:flutter/cupertino.dart';

import 'package:flutter/widgets.dart';

///

/// 输入提示框

///

class ShowInputAlertWidget extends StatefulWidget {

final confirmCallback;

  final title;

  final placeholder;

  const ShowInputAlertWidget(this.confirmCallback, this.title, this.placeholder);

  @override

  _ShowInputAlertWidgetStatecreateState() =>_ShowInputAlertWidgetState();

}

class _ShowInputAlertWidgetStateextends State {

 StringinputValue ='';

  @override

  Widgetbuild(BuildContext context) {

return CupertinoAlertDialog(

      title:Text(widget.title),

      content:Column(

       children: [

           CupertinoTextField(

            placeholder:widget.placeholder,

            onChanged: (value){

                inputValue = value;

            },

          )

    ],

      ),

      actions: [

  CupertinoDialogAction(

        child:Text('取消'),

          onPressed: (){

                Navigator.pop(context);

          },

        ),

        CupertinoDialogAction(

         child:Text('确定'),

          onPressed: (){

                widget.confirmCallback(inputValue);

          },

        )

    ],

    );

  }

}

调用:

AppTool().showCenterInputAlert(context, inputConfirmCallback, "请输入昵称", '请输入昵称');


5.自定义弹框

代码如下  自定义弹框  StyleDialog  Widget

import 'package:flutter/cupertino.dart';

import 'package:flutter/material.dart';

import 'package:flutter/widgets.dart';

///

/// 自定义弹窗

///

class StyleDialog extends StatefulWidget {

final confirmCallback;

  final title;

  final contentTitle;

  const StyleDialog(this.confirmCallback, this.title,this.contentTitle);

  @override

  _StyleDialogStatecreateState() =>_StyleDialogState();

}

class _StyleDialogStateextends State {

@override

  Widgetbuild(BuildContext context) {

    return SimpleDialog(

    titlePadding:EdgeInsets.only(top:15, bottom:5),

      title:Center(

        child:Text(widget.title),

      ),

      backgroundColor: Colors.white,

      shape:RoundedRectangleBorder(borderRadius:BorderRadius.circular(10)),

      children: [

        Divider(

            height:1,

        ),

        Container(

        alignment: Alignment.center,

          height:80,

          child:Text(widget.contentTitle,

              style:TextStyle(fontSize:17, color: Colors.black)),

        ),

        Container(

            child:Row(

                children: [

                    Expanded(

                        flex:2,

                    child:FlatButton(

                        onPressed: (){

                        Navigator.pop(context);

                      },

                      child:Container(

                        alignment: Alignment.center,

                        height:50,

                        decoration:BoxDecoration(

                        borderRadius:BorderRadius.circular(10),

                          color: Colors.white,

                          border:Border.all(color:Color(0xffFF4B38), width:1),

                        ),

                        child:Text('否',

                            style:TextStyle(

                            color:Color(0xffFF4B38), fontSize:17)),

                      ),

                    ),

                ),

                Expanded(

                    flex:3,

                    child:FlatButton(

                        onPressed: (){

                        widget.confirmCallback('');

                        Navigator.pop(context);

                      },

                        child:Container(

                         alignment: Alignment.center,

                          height:50,

                          decoration:BoxDecoration(

                            borderRadius:BorderRadius.circular(10),

                            color:Color(0xffFF4B38),

                            // border: Border.all(color: Color(0xffFF4B38),width: 1),

                          ),

                          child:Text('是',

                              style:TextStyle(color: Colors.white, fontSize:17)),

                        ))

        )

    ],

   ))

],

    );

  }

}

调用:

///自定义弹框样式

AppTool().showStyleAlert(context, styleConfirmCallback, "提示",'这里是取消关注的提示语…');

6、只有一个按钮的弹框

代码如下: 只有一个按钮弹框   ShowDefineAlertWidget   Widget

import 'package:flutter/material.dart';

class ShowDefineAlertWidget extends StatefulWidget {

final confirmCallback;

  final title;

  final hintText;

  const ShowDefineAlertWidget(this.confirmCallback, this.title, this.hintText);

  @override

  _ShowDefineAlertWidgetStatecreateState() =>_ShowDefineAlertWidgetState();

}

class _ShowDefineAlertWidgetStateextends State {

@override

  Widgetbuild(BuildContext context) {

    /// 设置弹框的宽度为屏幕宽度的86%

    var _dialogWidth = MediaQuery.of(context).size.width *0.86;

    return SimpleDialog(

        title:Column(

      children: [

          Padding(

            padding:EdgeInsets.only(bottom:10),

            child:Text(widget.title,

                style:TextStyle(

                  color: Colors.black,

                    fontSize:20,

                    fontWeight: FontWeight.w100)),

          ),

          Text(widget.hintText,

              style:TextStyle(

                color: Colors.black,

                  fontSize:18,

                  fontWeight: FontWeight.w100)),

        ],

      ),

      titlePadding:EdgeInsets.fromLTRB(10, 20, 10, 20),

      contentPadding: EdgeInsets.zero,

      children: [

        Divider(

            height:1,

        ),

        FlatButton(

            onPressed: () {

              widget.confirmCallback('');

              Navigator.pop(context);

            },

            child:Container(

             width: _dialogWidth,

              height:40,

              alignment: Alignment.center,

              child:Text(

                '确定',

                style:TextStyle(color: Colors.blue, fontSize:18),

              ),

            )),

      ],

    );

  }

}

调用:

AppTool().showDefineAlert(context, defineConfirmCallback, "温馨提示", '登陆已过期,请重新登陆');

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,270评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,489评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,630评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,906评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,928评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,718评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,442评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,345评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,802评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,984评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,117评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,810评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,462评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,011评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,139评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,377评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,060评论 2 355