flutter showDialog弹窗
可以弹窗嵌套一个类
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弹窗相关推荐
- Flutter 全局弹窗
背景 开发flutter-ui过程中,遇到了全局弹窗问题 友好的交互界面,能够产生更好的用户体验,比如查询接口较久或需要耗时处理程序时,给个loading效果. flutter组件中showDialo ...
- flutter自定义弹窗
今天接到这样一个需求,需要自定义弹窗,所以就有了如下的代码: 通过分析,一切皆widget 所以可以这样实现: import 'package:flutter/cupertino.dart'; imp ...
- Flutter AlertDialog弹框的基本使用、Flutter showDialog方法使用概述
优美的应用体验 来自于细节的处理,更源自于码农的自我要求与努力,当然也需要码农年轻灵活的思维,不局限于思维,不局限语言限制,才是编程的最高境界. 在Flutter中使用 AlertDialog 来构建 ...
- Flutter Dialog弹窗组件
文章目录 弹窗系列组件 概述 showDialog showCupertinoDialog showGeneralDialog showBottomSheet showModalBottomSheet ...
- Flutter 底部弹窗详解
在实际开发过程中,经常会用到底部弹窗来进行快捷操作,例如选择一个选项,选择下一步操作等等.在 Flutter 中提供了一个 showModelBottomSheet 方法用于弹出底部弹窗,本篇介绍如何 ...
- Flutter showDialog 如何刷新 setStatus
答案是抽出来... Future<void> _showRecommend() async {final flag = await showDialog(context: context, ...
- flutter 自定义弹窗组件
iOS风格中间弹窗 //这里是封装弹窗,组件化, class FaceStyleShowDialog{//这是两个按钮的弹窗static showCupertinoAlertDialogTwo(Bui ...
- flutter showDialog/AlertDialog 报错:No MaterialLocalizations found
这是因为dialog的context错误了,在main.dart中的main函数中需要新建一个MaterialApp对象,该对象的context才是dialog正确的context void main ...
- Flutter showDialog/showModalBottomSheet刷新UI
很多人使用StatefulBuilder依然达不到更新的效果,是因为你用错了setState()方法. 解决方案:StatefulBuilder showDialog(context: contex ...
最新文章
- Java高级规范之二
- 多线程读取矩阵文件+多线程矩阵乘法(C++实现)
- iOS 分类添加属性
- 关于set.insert的一个问题,是否是常量的问题(未解决问题)
- java二叉树 最大值_leetcode刷题笔记-654. 最大二叉树(java实现)
- C语言函数为什么不可以声明默认参数?
- Django:应用程序的两种架构:C/S架构,B/S架构,(TCP, URL)HTTP,HTTP request, HTTP response
- 别吹了!程序员自学Python,不如9岁小孩,网友:我不服.... ​
- 4989: [Usaco2017 Feb]Why Did the Cow Cross the Road
- WIN10电脑如何显示控制面板
- 2021年值得持续关注的10大网安工具
- java中如何实现货币兑换_java货币转换
- 想成为影视后期制作特效师要学什么?
- android相机固定焦距,android Camera 设置焦距
- Ubuntu进行apt-get出现Package xxx is not available,but is referred to by another package错误
- linux下系统中的文件传输
- 使用react开发谷歌插件
- 群英服务器网站,群英网
- c语言实现灰度图转换
- 什么是Nginx?有什么用?
热门文章
- 一行代码帮你检测Android模拟器优劣
- 响应式网页设计优势:流体网格的网站适合响应式网页设计。
- 【操作系统】-同步互斥-【2019真题】-有n位哲学家围在一张圆桌边..
- 前端每周清单第 7 期:Vue现状与展望、编写现代 JavaScript 代码、Web 开发者安全自检列表...
- 一个较复杂的React服务端渲染示例(React-Koa-Redux等)
- 计算机显示器屏的变化,PC屏幕技术变化_笔记本新闻-中关村在线
- 【安装Linux(巨详细步骤从VMware到安装Linux)】
- 战网登录-战网选择国家-战网battle.net问题解决
- 2千房补、8点打车报销、5天健康假、10天育儿假!反内卷!蚂蚁员工福利大升级!...
- win10无法打开计算机上的组策略对象,Win10组策略怎么打开_Win10如何打开组策略编辑器?-192路由网...