flutter 自定義dialog

效果圖
image.png
 import 'package:flutter/material.dart';
class dialog extends Dialog{
String title;
dialog({
this.title
});
final GlobalKey globalKey = GlobalKey(); //獲取wigdet寬高
  @override
  Widget build(BuildContext context){
     //創(chuàng)建透明層
     return new Material(
      type: MaterialType.transparency, //透明類型
      child: Center(
        child: Container(
          width: MediaQuery.of(context).size.width-50,
          height: MediaQuery.of(context).size.height/2 -30, //整個(gè)wigdet的高度
          child: Stack(
            children: <Widget>[
              //包含button和曲線的wigdet
          Container(
            alignment: Alignment.bottomCenter,
            width: MediaQuery.of(context).size.width-50,
            height: MediaQuery.of(context).size.height/2 -40,
            margin: EdgeInsets.only(top: 20.0),  //圓圈距離底部布局的距離
            decoration: new BoxDecoration(
              color: Colors.white,
              borderRadius: BorderRadius.circular(25.0),
            ),
            child: Column(
              children: <Widget>[
               ClipPath(
                 clipper: BottomClipper(),
                 child: Container(
                   height: MediaQuery.of(context).size.height/4 -60,
                   decoration: new BoxDecoration(
                   color: Colors.orange,
                   borderRadius: BorderRadius.circular(25.0),
                  ),
                 ),
               ),
                Column(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: <Widget>[
                    Container(
                  margin: EdgeInsets.all(20.0),
                  child: Text(title),
                )
                //按鈕
                 ,MaterialButton(
              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.all(Radius.circular(20.0))
              ),
              height: 25.0,
              minWidth: MediaQuery.of(context).size.height/2 -60,
              color: Colors.blue[400],
              textColor: Colors.white,
              child: new Text('我知道了',style:new TextStyle(
                fontSize: 10.0,color: Colors.white
              ),),
              onPressed: () {
                Navigator.pop(context);
              },
          ),
                  ],
                )
              ],
            )
          ), new Container(
             margin: EdgeInsets.only(left:(MediaQuery.of(context).size.width-50)/2 -25,top: 0),    
            constraints: BoxConstraints.expand(
              width: 50.0,
              height: 50.0,
            ),
            decoration: new BoxDecoration(
              color: Colors.blue,
              borderRadius: BorderRadius.circular(25.0),
            ),
          ),
            ],
          ),
          decoration: new BoxDecoration(
              color: Color(0x00000000),
            ),
        ),
      ),
     );
  }
}


 //繪制曲線
class BottomClipper extends CustomClipper<Path>{
  @override
  Path getClip(Size size){
    var path = Path(); 
    path.lineTo(0, 0);  
    path.lineTo(0, size.height - 40.0);  
    var firstControlPoint = Offset(size.width/4, size.height); 
    var firstEndPoint = Offset(size.width/2.25, size.height-30); 
    path.quadraticBezierTo(  
      firstControlPoint.dx, 
      firstControlPoint.dy, 
      firstEndPoint.dx, 
      firstEndPoint.dy);

    var secondControlPoint = Offset(size.width/4*3, size.height-90);  
    var secondEndPoint = Offset(size.width, size.height-40); 
    path.quadraticBezierTo( 
      secondControlPoint.dx, 
      secondControlPoint.dy, 
      secondEndPoint.dx, 
      secondEndPoint.dy);
    path.lineTo(size.width, size.height-40);
    path.lineTo(size.width, 0);
    return path;
  }
  @override
  bool shouldReclip(CustomClipper<Path> oldClipper) {
    return false;
  }
}
######引用方式
showDialog(
         context: context,
         builder: (BuildContext context){
          return new dialog(title:"這是一段提示消息");
         }
        );
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容