Установить барьер, который можно снять после отображения диалогового окна

#flutter #dialog

#трепетание #диалоговое окно

Вопрос:

Обычно я устанавливаю barrierDismissible для поля диалогового окна значение true или false

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

Однако это означает, что диалог ВСЕГДА имеет значение true или false.

Есть ли какой-либо способ запустить диалоговое barrierDismissible окно как false и изменить его на true через одну секунду?

Ответ №1:

Похоже, декларативный подход flutter не был применен к этому виджету. Поэтому вы должны сделать все самостоятельно.

Сначала обработайте кран с:

  • Общий детектор жестов, который будет использоваться для закрытия диалогового окна.
  • Детектор жестов вокруг вашего диалогового окна, чтобы предотвратить всплывающее событие касания, если оно произошло в виджете внутри вашего диалогового окна.

Во-вторых, используйте переменную, чтобы указать, barrierDismissible следует ли активировать или нет, и измените эту переменную через 1 секунду. Это переменная, которую следует использовать в качестве общего детектора жестов, чтобы узнать, должен ли он закрыть диалоговое окно или нет.

Вот быстрый пример, просто нажмите на:

 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,
                      ),
                    ),
                  ),
                ),
              );
            },
          );
        },
      ),
    );
  }
}
  

Ответ №2:

создайте переменную bool и установите для нее значение свойства barrierDismissible и используйте Future .задержка (длительность: длительность (секунды: 1)), чтобы отсчитать одну секунду, затем, когда счетчик завершится, установите для переменной значение true следующим образом.

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

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

}
  

Комментарии:

1. Вы тестировали свое решение? У меня это не работает.

2. Это приведет к запуску нового диалога через 1 секунду и даже не закроет старый.