#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 секунду и даже не закроет старый.