Dart 如何在“活动-颤振”顶部创建透明的全屏对话框

Dart 如何在“活动-颤振”顶部创建透明的全屏对话框,dart,flutter,flutter-layout,Dart,Flutter,Flutter Layout,我试图在活动顶部创建一个透明的全屏对话框。我已经试着遵循这个方法,但解决方案不起作用 简而言之,我需要的是: 全屏对话框 透明背景,我用于对话框的小部件除外 这是我的密码: 打开对话框 用于对话框视图 import'package:flatter/widgets.dart'; 类holepunchepainter扩展了CustomPainter{ 静态最终clearPaint=新油漆() …颜色=颜色。透明, ..blendMode=blendMode.clear; const holepu

我试图在活动顶部创建一个透明的全屏对话框。我已经试着遵循这个方法,但解决方案不起作用

简而言之,我需要的是:

  • 全屏对话框
  • 透明背景,我用于对话框的小部件除外
这是我的密码:

打开对话框

用于对话框视图

import'package:flatter/widgets.dart';
类holepunchepainter扩展了CustomPainter{
静态最终clearPaint=新油漆()
…颜色=颜色。透明,
..blendMode=blendMode.clear;
const holepunchepainter();
@凌驾
空心油漆(帆布,尺寸){
canvas.drawRect(
来自LTWH的新矩形(0.0,0.0,size.width,size.height),clearPaint);
}
@凌驾
bool应重新绘制(自定义代理){
返回true;
}
}
类GenreDialogUI扩展StatefulWidget{
@凌驾
_GenreDialogUI createState()=>new_GenreDialogUI();
}
类\u GenreDialogUI扩展状态{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:addAppbar(),
车身:新定制漆(
油漆工:Holepunchepainter(),
子容器:新容器(
颜色:颜色。透明,
对齐:对齐.center,
子项:UtilCommonWidget.addText('Transparent Dialog',Colors.red,22.0,1),
),
),
);
}
}

YourFullScreenAlertDialog可以是一个小部件,它的背景色为Colors.transparent,如前所述。

对我来说,以下是有效的:

showDialog(
  context: context,
  builder: (_) => Material(
    type: MaterialType.transparency,
    child: Center(
      // Aligns the container to center
      child: Container(
        // A simplified version of dialog.
        width: 100.0,
        height: 56.0,
        color: Colors.green,
        child: Text('jojo'),
      ),
    ),
  ),
);
屏幕截图(
showGeneralDialog
):


代码:

小部件构建(构建上下文){
返回脚手架(
body:SizedBox.expand(子项:flatterlogo()),
浮动操作按钮:浮动操作按钮(
子:图标(图标。在新中打开),
已按下:(){
显示通用对话框(
上下文:上下文,
barrierColor:Colors.black54,
pageBuilder:(uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,
);
},
),
);
}

检查此答案:您可以像此线程一样使用
ModalRoute
,请告诉我如何退出FullScreenAlertDialog()?在我的例子中,“YourFullScreenAlertDialog()”是一个无状态小部件,在PageRouteBuilder中启用“barrierDismissible:true”时不会弹出(而文档提到它会弹出)
import 'package:flutter/widgets.dart';

class HolePuncherPainter extends CustomPainter {
  static final clearPaint = new Paint()
    ..color = Colors.transparent,
    ..blendMode = BlendMode.clear;

  const HolePuncherPainter();

  @override
  void paint(Canvas canvas, Size size) {
    canvas.drawRect(
        new Rect.fromLTWH(0.0, 0.0, size.width, size.height), clearPaint);
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}

class GenreDialogUI extends StatefulWidget {
   @override
   _GenreDialogUI createState() => new _GenreDialogUI();
}

class _GenreDialogUI extends State<GenreDialogUI>  {

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: addAppbar(),
      body: new CustomPaint(
        painter: HolePuncherPainter(),
        child: new Container(
        color: Colors.transparent,
        alignment: Alignment.center,
        child: UtilCommonWidget.addText('Transparent Dialog', Colors.red, 22.0, 1),
        ),
      ),
    );
  }
}
Navigator.of(context).push(PageRouteBuilder(
    opaque: false,
    pageBuilder: (BuildContext context, _, __) {
        return YourFullScreenAlertDialog()
    }
));
showDialog(
  context: context,
  builder: (_) => Material(
    type: MaterialType.transparency,
    child: Center(
      // Aligns the container to center
      child: Container(
        // A simplified version of dialog.
        width: 100.0,
        height: 56.0,
        color: Colors.green,
        child: Text('jojo'),
      ),
    ),
  ),
);