Overlay на весь экран (flutter)
Мне нужно сделать появляющийся при клике и исчезающий по событию оверлей 'Loading...'
_insertOverlay(BuildContext context) {
return Overlay.of(context).insert(
OverlayEntry(builder: (context) {
final size = MediaQuery.of(context).size;
print(size.width);
return Visibility(visible: _isButtonDisabled, child: Scaffold(
backgroundColor: Colors.yellow[200],
body: Container(
alignment: Alignment.center,
child: Text('Loading'),
),
));
}
),
);
}
... При клике на кнопку: RaisedButton ( isScreenBlocked = true; insertOverlay(context); )
По нужному событию:
...
setState(() {
_isScreenBlocked = false; //прячем оверлей
});
Проблема в том что показать\спрятать оверлей в таком виде срабатывает только 1 раз. Как оптимальнее это сделать? Подозреваю что я что-то перемудрил. Не пойму как его добавить сразу в основной Scaffold поверх всех элементов и просто прятать показывать с помощью Visibility.
Благодарю за помощь!
Ответы (1 шт):
Автор решения: MiT
→ Ссылка
Показываем:
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return RaisedButton(
child: Text("Click!"),
onPressed: () => MyOverlay.show(context),
);
}
}
Прячем:
setState(() {
MyOverlay.hide();
});
Overlay:
class MyOverlay {
static final MyOverlay _singleton = MyOverlay._internal();
factory MyOverlay() => _singleton;
MyOverlay._internal();
static OverlayEntry _overlayEntry;
static OverlayState _overlayState;
static bool _isVisible = false;
static void show(BuildContext context) {
if (!_isVisible) {
_overlayState = Overlay.of(context);
_overlayEntry = _createOverlayEntry();
_overlayState.insert(_overlayEntry);
_isVisible = true;
}
}
static void hide() {
if (_isVisible) {
_overlayEntry.remove();
_isVisible = false;
}
}
static OverlayEntry _createOverlayEntry() {
return OverlayEntry(builder: (context) {
final size = MediaQuery.of(context).size;
return Container(
height: size.height,
width: size.width,
color: Colors.yellow[200],
alignment: Alignment.center,
child: Text('Loading'),
);
});
}
}