可以弹窗嵌套一个类

          showDialog(context: context,builder: (context) => BoxDialog(getUserShake.shakeBoxId)).then((value) => dialogClose(value));

也可以直接写布局

  showDialog(context: context,builder: (context) {return Center(child: SizedBox(child: Stack(alignment: Alignment.topCenter, children: [Container(decoration: BoxDecorationUtil().setFillBoxDecoration(Colors.white, 14.0),margin: const EdgeInsets.only(top: 35, right: 52, left: 52),child: Column(mainAxisSize: MainAxisSize.min, children: [Container(margin: const EdgeInsets.only(top: 54, bottom: 20, right: 20, left: 20),child: ContentTextBlod('对方设定视频通话需要打赏', 14.0, Colors.black,FontWeight.normal)),Row(mainAxisSize: MainAxisSize.min,crossAxisAlignment: CrossAxisAlignment.center,children: [const Image(image: AssetImage('assets/images/icon_diamond.png'),width: 16,height: 16),RightPadding(2),ContentTextBlod('30/分钟', 14.0, Colors.black, FontWeight.normal)]),GestureDetector(onTap: () {MyRouter.pop(context);callingPhone(callingScenes, false);},child: Container(height: 40,margin: const EdgeInsets.only(top: 10, right: 40, left: 40, bottom: 15),alignment: Alignment.center,decoration: BoxDecoration(//背景color: CommonColors.getColor27D6BC,//设置四周圆角 角度borderRadius:const BorderRadius.all(Radius.circular(20))// borderRadius: const BorderRadius.only(//     bottomLeft: Radius.circular(14),//     bottomRight: Radius.circular(14))),child: ContentTextBlod('继续', 17.0, Colors.white, FontWeight.w800))),Row(mainAxisSize: MainAxisSize.min,crossAxisAlignment: CrossAxisAlignment.center,children: [const Image(image: AssetImage('assets/images/icon_diamond.png'),width: 16,height: 16),RightPadding(2),ContentTextBlod('不再提示', 14.0, Colors.black, FontWeight.normal)]),TopPadding(15)]))])));});

弹窗内容

import 'dart:async';
import 'dart:convert';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:social_im/common/Global.dart';
import 'package:social_im/common/colors.dart';
import 'package:social_im/generated/l10n.dart';
import 'package:social_im/http/api.dart';
import 'package:social_im/http/net_callback.dart';
import 'package:social_im/http/rxhttp.dart';
import 'package:social_im/http/utils/NetUtils.dart';
import 'package:social_im/im/user_info.dart';
import 'package:social_im/pages/pay/model/extend.dart';
import 'package:social_im/pages/pay/pay_dialog.dart';
import 'package:social_im/pages/widget/myText.dart';
import 'package:social_im/pages/widget/splitLine.dart';
import 'package:social_im/provider/provider_wallet.dart';
import 'package:social_im/utils/image_utile.dart';
import '../../../common/globalEventBus.dart';
import '../../../constant/dimens.dart';
import '../../../http/http_request.dart';
import '../../../utils/loadingUtil.dart';
import '../data/OpenBoxCase.dart';class BoxDialog extends StatefulWidget {//宝箱IDint? shakeBoxId;BoxDialog(this.shakeBoxId);@overrideBoxDialogState createState() => BoxDialogState();
}class BoxDialogState extends State<BoxDialog> {//取屏幕最大宽度和高度final width = window.physicalSize.width;final height = window.physicalSize.height;//该弹窗0显示宝箱,1显示钻石int isCheck = 0;//钻石数量int? dialogAmount = 0;//钻石亮光bool _isExpand = false;//计时器late Timer? _mTimer = null;expandListen() {_mTimer = Timer.periodic(const Duration(seconds: 1),(Timer t) => setState(() {_isExpand = !_isExpand;}));}late StreamSubscription<ShakeCloseDialogEvent> _shakeCloseDialogEvent;@overridevoid initState() {expandListen();_shakeCloseDialogEvent = EventBusUtil.listen((event) {if (event.isClose) {Navigator.pop(context, true);}});super.initState();}@overridevoid dispose() {if (_mTimer != null) {_mTimer!.cancel();_mTimer = null;}_shakeCloseDialogEvent.cancel();super.dispose();}//开启宝箱获取砖石数量void openBoxCase(context, setState) {LoadingUtil.showLoading();HttpRequest.intance.postHttpFromBusiness(Api.API_OPEN_BOX, (data) {LoadingUtil.dismissLoading();OpenBox openBox = OpenBox.fromJson(data);setState(() {dialogAmount = openBox.amount;isCheck = 1;});}, (error) {LoadingUtil.dismissLoading();}, onErrorCode: (errorCode) {if (errorCode == 10041) {showDiamondInsufficientDialog(context);}}, parameters: {"shake_box_id": widget.shakeBoxId});}///钻石不足充值弹窗showDiamondInsufficientDialog(context) {LoadingUtil.showLoading();showPayDialog(context, onSuccess: () {_getExtendInfo(500);});}///获取金币、钻石等扩展信息void _getExtendInfo(int delay) {print('===========获取金币、钻石等扩展信息===========');Future.delayed(Duration(milliseconds: delay)).then((value) {LoadingUtil.dismissLoading();RxHttp<Extend>()..init()..setBaseUrl(Api.BUSINESS_BASE_API)..setPath(Api.API_USER_EXTENDINFO)..setCacheMode(CacheMode.NO_CACHE)..setJsonTransFrom((p0) => Extend.fromJson(json.decoder.convert(p0)['data']))..call(NetCallback(onNetFinish: (extend) {UserInfoUtil().getUsersInfo('${extend.userId}');Provider.of<WalletProvider>(Global.navigatorKey.currentContext!,listen: false).updateWallet(goldCoin: extend.goldCoin, diamond: extend.diamond);}), server: Servers.businessServer);});}//监听物理返回键Future<bool> _requestPop() {if (Navigator.canPop(context)) {Navigator.pop(context, false);}return Future.value(false);}@overrideWidget build(BuildContext context) {return WillPopScope(onWillPop: _requestPop,child: Center(child: Stack(children: [if (isCheck == 0) _boxDialog(context),if (isCheck == 1) diamondDialog(context),],),),);}//宝箱Widget _boxDialog(context) {return GestureDetector(onTap: () {//点击背景可以返回},child: Material(//用这个,字体正常的color: Colors.transparent,//设置背景透明child: Center(///弹框大小child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [GestureDetector(onTap: () {},child: Container(margin: const EdgeInsets.only(left: 50, right: 50, top: 110),decoration: BoxDecoration(border:Border.all(color: const Color(0xFFFEF9E8), width: 1),borderRadius: BorderRadius.circular(14)),child: Container(decoration: BoxDecoration(color: const Color(0xFFFEF9E8),border: Border.all(color: const Color(0xFF2F2B2B), width: 2),borderRadius: BorderRadius.circular(14)),child: Column(children: [Stack(alignment: Alignment.topCenter,children: [Container(width: width,padding: const EdgeInsets.only(bottom: 23),child: Container(decoration: const ShapeDecoration(shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(8.0),),),),child: Column(mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: <Widget>[Stack(alignment: Alignment.topCenter,children: [SizedBox(width: width,child: ClipRRect(child: ImageUtile.imageWidget("assets/images/icon_game_shake_box.png",fit: BoxFit.fitWidth),)),Container(margin:const EdgeInsets.only(top: 11),child: Text(S.current.shake_100_reward,style: const TextStyle(color: Color(0xFFFF3B30),fontSize: 16,fontWeight: FontWeight.bold,decoration:TextDecoration.none),),),],),],),),),Positioned(bottom: -10,child: Container(padding: const EdgeInsets.only(bottom: 10),child: Column(crossAxisAlignment: CrossAxisAlignment.end,children: [Stack(alignment: Alignment.topRight,children: [// Container(//     width: 40,//     height: 20,//     alignment: Alignment.center,//     margin: const EdgeInsets.only(//         right: 10, top: 10),//     decoration: BoxDecorationUtil()//         .setFillGradientBoxDecoration(//             CommonColors.getColorFF9D00,//             CommonColors.getColorFF6500,//             0.0)),GestureDetector(onTap: () {setState(() {openBoxCase(context, setState);});},child: Container(margin: const EdgeInsets.only(top: 10, bottom: 20),padding: const EdgeInsets.only(top: 8,bottom: 7,left: 85,right: 85),decoration: BoxDecoration(color:const Color(0xFF25D6BC),borderRadius:BorderRadius.circular(19),border: Border.all(color: Colors.white,width: 1)),child: Text(S.current.shake_open,style: const TextStyle(color: Colors.white,fontSize:Dimens.fontSize_18,decoration:TextDecoration.none),),),),Container(width: 50,height: 20,alignment: Alignment.center,margin: const EdgeInsets.only(),child: Row(mainAxisSize:MainAxisSize.min,children: [const Image(image: AssetImage('assets/images/icon_diamond.png'),gaplessPlayback: true,width: 10,height: 10),Padding(padding:const EdgeInsets.only(left: 2),child: ContentText('${1}',12.0,Colors.white))]),decoration: BoxDecorationUtil().setFillGradientBoxDecoration(CommonColors.getColorFF9D00,CommonColors.getColorFF6500,32.0)),])],),),),],),],),),),),GestureDetector(onTap: () {Navigator.pop(context,false);},child: Container(margin: const EdgeInsets.only(top: 25),child: const Image(image: AssetImage('assets/images/icon_game_shake_close@2x.png'),width: 50,fit: BoxFit.fitWidth),),),],),),),);}//钻石Widget diamondDialog(context) {return GestureDetector(onTap: () {},child: Material(color: Colors.transparent,child: Center(///弹框大小child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [GestureDetector(onTap: () {},child: Stack(alignment: Alignment.topCenter,children: [Container(margin:const EdgeInsets.only(left: 50, right: 50, top: 110),decoration: BoxDecoration(border: Border.all(color: const Color(0xFFFEF9E8), width: 1),borderRadius: BorderRadius.circular(14)),child: Container(decoration: BoxDecoration(color: const Color(0xFFFEF9E8),border: Border.all(color: const Color(0xFF2F2B2B), width: 2),borderRadius: BorderRadius.circular(14)),child: Column(children: [Stack(alignment: Alignment.bottomCenter,children: [Stack(alignment: Alignment.topCenter,children: [Container(width: width,margin: const EdgeInsets.only(top: 19, bottom: 23),child: Container(decoration: const ShapeDecoration(shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(8.0),),),),child: Column(mainAxisAlignment:MainAxisAlignment.center,crossAxisAlignment:CrossAxisAlignment.center,children: <Widget>[Stack(alignment: Alignment.center,children: [if (_isExpand)SizedBox(width: width,child: ClipRRect(borderRadius:BorderRadius.circular(14),child: ImageUtile.imageWidget("assets/images/icon_game_shake_light.png",fit: BoxFit.fitWidth),)),if (!_isExpand)SizedBox(width: width,child: Directionality(textDirection:TextDirection.rtl,child: Image.asset('assets/images/icon_game_shake_light_rtl.png',fit: BoxFit.fitWidth,matchTextDirection:true,)),),SizedBox(width: width,child: ClipRRect(borderRadius:BorderRadius.circular(14),child: ImageUtile.imageWidget("assets/images/icon_game_shake_dia.png",),)),],),],),),),Positioned(top: 11,child: Container(padding: const EdgeInsets.only(left: 50, right: 50, top: 10),child: Text(S.current.shake_congratulation,style: const TextStyle(color: Color(0xFFF43113),fontSize: 22,decoration:TextDecoration.none),)),),],),dialogAmount != 0? Container(margin: const EdgeInsets.only(top: 4, bottom: 20),child: Text("X$dialogAmount",style: const TextStyle(color: Color(0xFFF43113),fontSize: 22,decoration: TextDecoration.none),),): Container(margin: const EdgeInsets.only(top: 4, bottom: 20),),],),],),),),],),),GestureDetector(onTap: () {Navigator.pop(context,false);},child: Container(margin: const EdgeInsets.only(top: 25),child: const Image(image: AssetImage('assets/images/icon_game_shake_close@2x.png'),width: 50,fit: BoxFit.fitWidth),),),],),),),);}
}

如果是从底部弹起的弹窗

 showChatDialog(matchUserBean) {showModalBottomSheet(shape: const RoundedRectangleBorder(borderRadius: BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24))),isScrollControlled: true,enableDrag: false,backgroundColor: CommonColors.getColorF5F8F5,context: context,builder: (context) =>ChatMatchDialog(matchUserBean, PlayDisposition.SLIDING_MATCH));//ChatMatchDialog是一个类}

底下弹窗showModalBottomSheet
嵌套类

      showModalBottomSheet(shape: const RoundedRectangleBorder(borderRadius: BorderRadius.only(topLeft: Radius.circular(24), topRight: Radius.circular(24))),isScrollControlled: true,enableDrag: false,backgroundColor: CommonColors.getColorF5F8F5,context: context,builder: (context) => MatchFriendDialog(2,PlayDisposition.BOTTLE,MatchUserBean(userID: _unlockUser?.userInfo?.userId,nickName: _unlockUser?.userInfo?.nickname,avatar: _unlockUser?.userInfo?.avatar,// avatarThumb:_unlockUser?.userInfo?.avatarThumb,sign: _unlockUser?.userInfo?.sign,sex: _unlockUser?.userInfo?.sex,birthday: _unlockUser?.userInfo?.birthday,vipLevel: _unlockUser?.userInfo?.vipLevel// vipExpirationTime:_unlockUser?.userInfo?.vipExpirationTime)));

直接写布局

    showModalBottomSheet(shape: const RoundedRectangleBorder(borderRadius: BorderRadius.only(topLeft: Radius.circular(32), topRight: Radius.circular(32))),isScrollControlled: true,backgroundColor: Colors.white,context: context,builder: (context) {return ListView.separated(shrinkWrap: true,itemBuilder: (context, index) {if (index == 0) {return Ink(decoration: const BoxDecoration(borderRadius: BorderRadius.only(topLeft: Radius.circular(32),topRight: Radius.circular(32))),child: InkWell(onTap: () {onPress(0);Navigator.pop(context, true);},borderRadius: const BorderRadius.only(topLeft: Radius.circular(32),topRight: Radius.circular(32)),child: SizedBox(height: 72,child: Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [Align(alignment: Alignment.center,child: Text(contents[index],style: TextStyle(fontSize: Dimens.fontSize_16,color: (selectIndex>0 &&selectIndex == index)? CommonColors.getColorE97676: CommonColors.getColor181818),),),],),),));}return InkWell(onTap: () {onPress(index);Navigator.pop(context,true);},child: SizedBox(height: index == 1 ? 55 : 64,child: Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: [Align(alignment: Alignment.center,child: Text(contents[index],style: TextStyle(fontSize: Dimens.fontSize_16,color: (selectIndex>0 &&selectIndex == index)? CommonColors.getColorE97676: CommonColors.getColor181818),),),]),));},separatorBuilder: (context, index) {return Divider(height: 3,color: CommonColors.getColorDivider_F7F7F7,);},itemCount: contents.length);});

flutter showDialog弹窗相关推荐

  1. Flutter 全局弹窗

    背景 开发flutter-ui过程中,遇到了全局弹窗问题 友好的交互界面,能够产生更好的用户体验,比如查询接口较久或需要耗时处理程序时,给个loading效果. flutter组件中showDialo ...

  2. flutter自定义弹窗

    今天接到这样一个需求,需要自定义弹窗,所以就有了如下的代码: 通过分析,一切皆widget 所以可以这样实现: import 'package:flutter/cupertino.dart'; imp ...

  3. Flutter AlertDialog弹框的基本使用、Flutter showDialog方法使用概述

    优美的应用体验 来自于细节的处理,更源自于码农的自我要求与努力,当然也需要码农年轻灵活的思维,不局限于思维,不局限语言限制,才是编程的最高境界. 在Flutter中使用 AlertDialog 来构建 ...

  4. Flutter Dialog弹窗组件

    文章目录 弹窗系列组件 概述 showDialog showCupertinoDialog showGeneralDialog showBottomSheet showModalBottomSheet ...

  5. Flutter 底部弹窗详解

    在实际开发过程中,经常会用到底部弹窗来进行快捷操作,例如选择一个选项,选择下一步操作等等.在 Flutter 中提供了一个 showModelBottomSheet 方法用于弹出底部弹窗,本篇介绍如何 ...

  6. Flutter showDialog 如何刷新 setStatus

    答案是抽出来... Future<void> _showRecommend() async {final flag = await showDialog(context: context, ...

  7. flutter 自定义弹窗组件

    iOS风格中间弹窗 //这里是封装弹窗,组件化, class FaceStyleShowDialog{//这是两个按钮的弹窗static showCupertinoAlertDialogTwo(Bui ...

  8. flutter showDialog/AlertDialog 报错:No MaterialLocalizations found

    这是因为dialog的context错误了,在main.dart中的main函数中需要新建一个MaterialApp对象,该对象的context才是dialog正确的context void main ...

  9. Flutter showDialog/showModalBottomSheet刷新UI

    很多人使用StatefulBuilder依然达不到更新的效果,是因为你用错了setState()方法. 解决方案:StatefulBuilder  showDialog(context: contex ...

最新文章

  1. Java高级规范之二
  2. 多线程读取矩阵文件+多线程矩阵乘法(C++实现)
  3. iOS 分类添加属性
  4. 关于set.insert的一个问题,是否是常量的问题(未解决问题)
  5. java二叉树 最大值_leetcode刷题笔记-654. 最大二叉树(java实现)
  6. C语言函数为什么不可以声明默认参数?
  7. Django:应用程序的两种架构:C/S架构,B/S架构,(TCP, URL)HTTP,HTTP request, HTTP response
  8. 别吹了!程序员自学Python,不如9岁小孩,网友:我不服.... ​
  9. 4989: [Usaco2017 Feb]Why Did the Cow Cross the Road
  10. WIN10电脑如何显示控制面板
  11. 2021年值得持续关注的10大网安工具
  12. java中如何实现货币兑换_java货币转换
  13. 想成为影视后期制作特效师要学什么?
  14. android相机固定焦距,android Camera 设置焦距
  15. Ubuntu进行apt-get出现Package xxx is not available,but is referred to by another package错误
  16. linux下系统中的文件传输
  17. 使用react开发谷歌插件
  18. 群英服务器网站,群英网
  19. c语言实现灰度图转换
  20. 什么是Nginx?有什么用?

热门文章

  1. 一行代码帮你检测Android模拟器优劣
  2. 响应式网页设计优势:流体网格的网站适合响应式网页设计。
  3. 【操作系统】-同步互斥-【2019真题】-有n位哲学家围在一张圆桌边..
  4. 前端每周清单第 7 期:Vue现状与展望、编写现代 JavaScript 代码、Web 开发者安全自检列表...
  5. 一个较复杂的React服务端渲染示例(React-Koa-Redux等)
  6. 计算机显示器屏的变化,PC屏幕技术变化_笔记本新闻-中关村在线
  7. 【安装Linux(巨详细步骤从VMware到安装Linux)】
  8. 战网登录-战网选择国家-战网battle.net问题解决
  9. 2千房补、8点打车报销、5天健康假、10天育儿假!反内卷!蚂蚁员工福利大升级!...
  10. win10无法打开计算机上的组策略对象,Win10组策略怎么打开_Win10如何打开组策略编辑器?-192路由网...