使用 GetX 返回带有 TextField 的屏幕时,在向后滑动手势后键盘不会出现

问题描述 投票:0回答:1
我正在开发一个使用 GetX 进行状态管理的 Flutter 应用程序,我遇到了一个问题,即在导航离开然后使用向后滑动手势返回后返回到带有 TextField 的屏幕时,键盘不会出现。

重现步骤: 打开带有文本字段的屏幕(例如聊天屏幕)。 点击文本字段以确保键盘出现。 通过点击个人资料图像等元素导航到另一个屏幕(例如个人资料屏幕)。 使用向后滑动手势导航回上一个屏幕(例如聊天屏幕)。 再次点击文本字段。 预期行为: 返回屏幕后点击文本字段时应该会出现键盘。

实际行为: 使用向后滑动手势返回屏幕后,点击文本字段时不会出现键盘。

代码示例: 以下是使用 GetX 实现聊天和个人资料屏幕的简化版本:

main.dart:

import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'chat_screen.dart'; import 'profile_screen.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return GetMaterialApp( title: 'Flutter Demo', home: ChatScreen(), ); } }
chat_screen.dart

import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'profile_screen.dart'; class ChatScreen extends StatefulWidget { @override _ChatScreenState createState() => _ChatScreenState(); } class _ChatScreenState extends State<ChatScreen> with WidgetsBindingObserver { final TextEditingController _controller = TextEditingController(); final FocusNode _focusNode = FocusNode(); @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); _controller.dispose(); _focusNode.dispose(); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.resumed) { _focusNode.requestFocus(); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Chat"), actions: [ IconButton( icon: Icon(Icons.account_circle), onPressed: () { Get.to(() => ProfileScreen()); }, ), ], ), body: Center( child: TextField( controller: _controller, focusNode: _focusNode, decoration: InputDecoration( hintText: "Type a message", ), ), ), ); } }
使用向后滑动手势导航回任何带有 TextField 的屏幕时,会始终出现此问题。如果我使用后退按钮而不是向后滑动手势,键盘将正常工作。我将 GetX 与 GetMaterialApp 一起使用。

如何确保在使用 GetX 的向后滑动手势导航回屏幕后,输入字段的键盘能够可靠地显示?

我尝试过的:

    使用 WidgetsBindingObserver 监听应用程序生命周期事件并重新聚焦 FocusNode。
  • 当依赖关系发生变化时,使用 didChangeDependency 重新聚焦 FocusNode。
  • 在各种生命周期方法中手动调用FocusScope.of(context).requestFocus(_focusNode)。
flutter dart keyboard flutter-getx
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.