Я не дам вам точное решение, но я постараюсь помочь вам.
Функция showDialog позволяет открыть модальное диалоговое окно.
Вы можете использовать initState метод внутри State из StatefulWidget для вызова showDialog при запуске (когда ваша страница создается впервые),
Есть плагин для обнаружения дрожания телефона.
Когда вы обнаруживаете сотрясение, вы должны проверить, открыто ли диалоговое окно (возможно, сохранен какой-либо флаг), и, если оно открыто, вызовите Navigator.of(context).pop();
, чтобы закрыть его.
UPD: нормальноздесь приходит решение:
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
ShakeDetector detector;
bool dialogOpened = true;
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) {
showDialog(
context: context,
builder: (cxt) => AlertDialog(content: Text('shake to close')),
).then((_) => dialogOpened = false);
});
detector = ShakeDetector.autoStart(
onPhoneShake: () {
if (dialogOpened) {
Navigator.of(context).pop();
}
detector?.stopListening();
detector = null;
}
);
super.initState();
}
@override
void dispose() {
detector?.stopListening();
super.dispose();
}
@override
Widget build(BuildContext context) {...}
}
Также добавьте shake_event: ^0.0.4
к зависимостям в pubspec.yaml .