在显示对话框后将屏障设置为可忽略

时间:2020-10-14 12:27:09

标签: flutter dialog

这是我通常将对话框的barrierDismissible字段设置为true或false的方式

showDialog(
  barrierDismissible: false,
  builder: ...
)

但是,这意味着对话框始终是对还是错。

是否有办法以一秒钟 false 的身份启动对话框barrierDismissible并将其更改为 true

2 个答案:

答案 0 :(得分:1)

似乎没有声明式的声明方法应用于此小部件。因此,您应该自己做所有事情。

首先使用以下方法处理水龙头:

  • 将用于关闭对话框的常规手势检测器。
  • 对话框周围的手势检测器,以防止点击事件在对话框内部的小部件中发生时冒泡。

第二次使用变量来说明是否应激活barrierDismissible,并在1秒钟后修改此变量。此变量应该用作常规手势检测器,以便知道是否应该关闭对话框。

以下是一个快速示例,只需轻按FAB:

import 'package:flutter/material.dart';

void main() => runApp(
      MaterialApp(
        home: MyApp(),
      ),
    );

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool barrierDismissible = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          showDialog(
            context: context,
            builder: (BuildContext context) {
              barrierDismissible = false;
              Future.delayed(
                  Duration(seconds: 1),
                  () => setState(() {
                        barrierDismissible = true;
                      }));
              return GestureDetector(
                onTap: () {
                  if (barrierDismissible) {
                    Navigator.of(context, rootNavigator: true).pop();
                  }
                },
                child: Material(
                  color: Colors.transparent,
                  child: GestureDetector(
                    onTap: () {},
                    child: Center(
                      child: Container(
                        height: 200,
                        width: 200,
                        color: Colors.red,
                      ),
                    ),
                  ),
                ),
              );
            },
          );
        },
      ),
    );
  }
}

答案 1 :(得分:0)

创建bool变量并将其设置为barrierDismissible属性,并使用Future.delayed(duration:Duration(seconds:1))进行一秒钟的计数,然后在计数器完成时像这样将变量设置为true。

onPressed:(){
bool dismissible=false;
showDialog(context: context,barrierDismissible: dismissible); //add your child
        Future.delayed(Duration(seconds: 1)).whenComplete(() {

          setState(() {
            dismissible=true;
          });
        });

}