Flutter Как скрыть AlertDialog при нажатии кнопки «Назад» на Android, если клавиатура открытаAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Flutter Как скрыть AlertDialog при нажатии кнопки «Назад» на Android, если клавиатура открыта

Сообщение Anonymous »

У меня есть диалоговое окно оповещения с текстовым полем с автофокусом, поэтому, когда диалоговое окно оповещения открыто, клавиатура открывается автоматически. Но если я нажму кнопку «Назад» на Android, закроется только клавиатура, и мне нужно снова нажать кнопку «Назад», чтобы закрыть диалоговое окно.
У меня есть желаемое поведение в обратном вызове OnSubmit TextField, где я просто использую Navigator .pop(контекст). Но я предполагаю, что это работает, поскольку я просто закрываю alertDialog, и клавиатура закрывается вместе с ним, поскольку больше нет текста для заполнения. Но когда я нажимаю кнопку «Назад», у меня нет возможности отслеживать ее в диалоговом окне «TextField» или «Alert», поэтому я не могу использовать Navigator.pop(context).
Я пробовал использовать PopScope в диалоговом окне «Alert», Scaffold и даже MaterialApp — он не регистрирует 1-е нажатие кнопки «Назад», а только 2-е. Я также пробовал использовать KeyboardListener, чтобы найти нажатие кнопки BackButton, но мне удалось заставить его работать.
Я предполагаю, что это связано с тем, что закрытие клавиатуры не меняет фокус TextField и его нельзя перехватить с помощью PopScope или других методов.
Вот как мне удалось заставить это работать, но я думаю, что это слишком долго, и это влияет на анимацию клавиатуры. Если оно длиннее, это не сработает.
Здесь я проверяю, что окно закрывается только один раз, когда оно пытается вызвать Navigator.pop(context) дважды, и оно просто закрывает все приложение. саму страницу и делает ее черной.
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:todo_app/utils/global_utils.dart' as globals;

class BasicWindow extends StatefulWidget {
const BasicWindow({super.key});

@override
State createState() => _BasicWindowState();
}

class _BasicWindowState extends State {
@override
Widget build(BuildContext context) {
//make sure the build is finished
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;
if (globals.mobile) {
Future.delayed(const Duration(milliseconds: 400), () {
bool noKeyboardShown =
MediaQuery.of(context).viewInsets.bottom == 0.0;
if (noKeyboardShown & !globals.dialogClosed) {
globals.dialogClosed = true;
Navigator.pop(context);
Future.delayed(const Duration(milliseconds: 600), () {
globals.dialogClosed = false;
});
}
});
}
});

return AlertDialog(
content: TextField(
//focusNode: _textFocus,
onSubmitted: (value) {
Navigator.pop(context);
},

),
);
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... d-if-the-k
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»