У меня есть простой виджет без сохранности с пользовательской панелью приложений, затем кнопка Textformfield и кнопка в столбце . Я использую GO_ROUTER для навигации. Утилит экрана для размеров Dimen. Проблема в том, что я запустил свои маршруты с экрана Splash, затем входите в систему экрана с Textfield. Встречается на всех устройствах, включая эмулятор Android и физические устройства
На экране Textfield on Login, если он нажимает пользователь в 100 мс к 200 мс , клавиатура появляется, а затем скрывается самого самого.
Код: Выделить всё
@TypedGoRoute(path: '/complaintScreenRoute')
class ComplaintScreenRoute extends GoRouteData {
final String complaintType;
const ComplaintScreenRoute({required this.complaintType});
@override
Widget build(BuildContext context, GoRouterState state) => injector().getComplaintScreenWidget(complaintType);
}
< /code>
Это способ, которым я создаю свой go_router. Я предполагаю, что этот экран после того, как вход в систему был выполнен пользователем. Затем приземляется на этом экране: < /p>
Метод сборки содержит: < /p>
Container(
color: Colors.yellow,
height: 200,
width: 200,
child:
TextFormField(
controller: model.myController,
autofocus: true,
)
),
Код: Выделить всё
class BulletproofTextFieldGreat extends StatefulWidget {
final TextEditingController controller;
final bool autofocus;
final FocusNode? focusNode;
final String? hintText;
const BulletproofTextFieldGreat({
super.key,
required this.controller,
this.autofocus = false,
this.focusNode,
this.hintText,
});
@override
State createState() => _BulletproofTextFieldGreatState();
}
class _BulletproofTextFieldGreatState extends State {
late FocusNode _internalFocusNode;
FocusNode get _focusNode => widget.focusNode ?? _internalFocusNode;
@override
void initState() {
super.initState();
_internalFocusNode = FocusNode();
if (widget.autofocus) {
// Delay autofocus until the screen is stable after navigation
WidgetsBinding.instance.addPostFrameCallback((_) {
Future.delayed(const Duration(milliseconds: 300), () {
if (mounted && !_focusNode.hasFocus) {
FocusScope.of(context).requestFocus(_focusNode);
}
});
});
}
}
@override
void dispose() {
if (widget.focusNode == null) {
_internalFocusNode.dispose();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
return TextField(
controller: widget.controller,
focusNode: _focusNode,
decoration: InputDecoration(hintText: widget.hintText),
);
}
}
< /code>
Так что я пытаюсь преодолеть автофокус по умолчанию. Я откладываю поле, чтобы сосредоточиться, если оно сосредоточится на сборке. Но я также проверил, будет ли мой виджет восстанавливается в течение нескольких раз, добавляя метод входа в систему внедрения виджета, который показывает только 1 раз. Я добавляю задержку в качестве обходного пути, чтобы, если пользователь быстро нажимает, клавиатура не должна скрываться. Сам.
Я попробовал со всеми полями ввода, такими как Cupertinotextfield , так как я получил эту проблему на 3.24.0, а затем обновил до 3,27,4, а затем 3,29,2, но все же получил проблему. < /p>
flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.29.2, on macOS 15.3.2 24D81 darwin-x64, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK version 36.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 16.2)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2023.1)
[✓] Connected device (3 available)
[✓] Network resources
• No issues found!
< /code>
Любой подсказка или решение будут высоко оценены.
заранее < /p>
Подробнее здесь: https://stackoverflow.com/questions/795 ... -textfield
Мобильная версия