重现步骤: 打开带有文本字段的屏幕(例如聊天屏幕)。 点击文本字段以确保键盘出现。 通过点击个人资料图像等元素导航到另一个屏幕(例如个人资料屏幕)。 使用向后滑动手势导航回上一个屏幕(例如聊天屏幕)。 再次点击文本字段。 预期行为: 返回屏幕后点击文本字段时应该会出现键盘。
实际行为: 使用向后滑动手势返回屏幕后,点击文本字段时不会出现键盘。
代码示例: 以下是使用 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 的向后滑动手势导航回屏幕后,输入字段的键盘能够可靠地显示?
我尝试过的:
autofocus 设置为 true。在屏幕之间导航可能会导致 TextField 失去焦点。