我们项目开发中,有很多地方会用到dialog,虽然flutter自身也有,比如AboutDialog、AlertDialog、SimpleDialog、CupertinoAlertDialog等等之类的,但是这些满足不了我们的控制欲,我们想要的是它可以根据我们的想法而随改变,并不是那么死板,所以呢,就想到封装好多的组件来用,一来,提高了它的灵活性,二来,可以分享给他人使用,三来,可以提高自身对于flutter 的进一步认识等等,总之呢,一句话,封装肯定比不封装好的很多,废话不多说,直接上代码:



class CustomDialog extends Dialog {final double width; // 宽度final double height; // 高度final String title; // 顶部标题final String content; // 内容final String cancelTxt; // 取消按钮的文本final String enterTxt; // 确认按钮的文本final Function callback; // 修改之后的回掉函数CustomDialog({this.width: 270,this.height: 141,this.title,this.content, // 根据content来,判断显示哪种类型this.cancelTxt: "取消",this.enterTxt: "确认",this.callback});@overrideWidget build(BuildContext context) {ScreenUtil.instance = ScreenUtil(width: 375, height: 812)..init(context); // 屏幕适配String _inputVal = "";return GestureDetector( // 点击遮罩层隐藏弹框child: Material(type: MaterialType.transparency, // 配置透明度child: Center(child: GestureDetector( // 点击遮罩层关闭弹框,并且点击非遮罩区域禁止关闭onTap: () {print('我是非遮罩区域~');},child: Container(width: this.width,height: this.height,decoration: BoxDecoration(borderRadius: BorderRadius.circular(10),color: Colors.white,),child: Stack(alignment: Alignment.bottomCenter,children: <Widget>[Visibility(visible: this.content == null ? true : false,child: Positioned(top: 0,child: Container(alignment: Alignment.center,margin: EdgeInsets.fromLTRB(0, 19, 0, 19),child: Text("${this.title}",style: TextStyle(fontSize: ScreenUtil(allowFontScaling: true).setSp(17), color: Color(0xff000000),fontWeight: FontWeight.w600))))),Container(padding: EdgeInsets.fromLTRB(15, 0, 15, 0),alignment: Alignment.center,child: this.content != null ?Container(width: double.infinity,margin: EdgeInsets.fromLTRB(0, 0, 0, 42),alignment: Alignment.center,child: Text("${this.content}",style: TextStyle(color: Colors.black,fontSize: ScreenUtil(allowFontScaling: true).setSp(17),fontWeight: FontWeight.w600))):TextField(textAlignVertical: TextAlignVertical.center,style: TextStyle(fontSize: ScreenUtil(allowFontScaling: true).setSp(13)),textInputAction: TextInputAction.send,decoration: new InputDecoration(hintText: '${this.title}',contentPadding: const EdgeInsets.symmetric(vertical: 3.0, horizontal: 5.0),enabledBorder: OutlineInputBorder( // 边框默认色borderSide: const BorderSide(color: Color(0xffC8C7CC))),focusedBorder: OutlineInputBorder( // 聚焦之后的边框色borderSide: const BorderSide(color: Color(0xfff3187D2))),),onChanged: (value) {_inputVal = value;})),Container(height: 43,decoration: BoxDecoration(border: Border(top: BorderSide(width: 1,color: Color(0xffEFEFF4)))),child: Row(children: <Widget>[Expanded(flex: 1,child: GestureDetector(behavior: HitTestBehavior.opaque,child: Container(height: double.infinity,alignment: Alignment.center,decoration: BoxDecoration(border: Border(right: BorderSide(width: 1,color: Color(0xffEFEFF4)))),child: Text("${this.cancelTxt}",textAlign: TextAlign.center,style: TextStyle(color: Color(0xff007AFF),fontSize: ScreenUtil(allowFontScaling: true).setSp(17),fontWeight: FontWeight.w400))),onTap: () {Navigator.pop(context);})),Expanded(flex: 1,child: GestureDetector(behavior: HitTestBehavior.opaque,child: Container(height: double.infinity, // 继承父级的高度alignment: Alignment.center,child: Text("${this.enterTxt}",textAlign: TextAlign.center,style: TextStyle(color: Color(0xff007AFF),fontSize: ScreenUtil(allowFontScaling: true).setSp(17),fontWeight: FontWeight.w600))),onTap: () {if(this.content != null) {this.callback(_inputVal); // 通过回掉函数传给父级}Navigator.pop(context); // 关闭dialog}))]))]))))),onTap: () {Navigator.pop(context);});}
}
看完之后是不是感觉很简单呢,喜欢的直接拿去用吧~~,接下来,我们看看如何调用它的,其实也超简单的哦
showDialog(context: context,builder: (context) {return CustomDialog(title: '昵称',enterTxt: "修改",callback: (res) {setState(() {this.settingData[index]['message'] = res;});this.editorToast();} );}
);
以上呢就是我写的封装自定义dialog,欢迎大家评论,如有写的不足之处,还请各位大佬多多指出,谢谢大家啦🥰~












