I'm developing a Flutter application using GetX for state management, and I'm facing an issue where the keyboard does not appear when returning to a screen with a TextField after navigating away and then using the swipe-back gesture to return.
Steps to Reproduce: Open a screen with a TextField (e.g., a chat screen). Tap on the TextField to ensure the keyboard appears. Navigate to another screen (e.g., a profile screen) by tapping an element such as a profile image. Use the swipe-back gesture to navigate back to the previous screen (e.g., the chat screen). Tap on the TextField again. Expected Behavior: The keyboard should appear when tapping on the TextField after returning to the screen.
Actual Behavior: The keyboard does not appear when tapping on the TextField after using the swipe-back gesture to return to the screen.
Code Example: Here is a simplified version of the chat and profile screen implementation using 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",
),
),
),
);
}
}
This issue occurs consistently when using the swipe-back gesture to navigate back to any screen with a TextField. The keyboard functions normally if I use the back button instead of the swipe-back gesture. I'm using GetX with GetMaterialApp.
How can I ensure the keyboard reliably appears for input fields after navigating back to a screen using the swipe-back gesture with GetX?
What I've Tried:
The github related issue 148867. If you wanna stay in stable channel, you have to downgrade to 3.19.6. It seems like stable version is not stable anymore.
update: flutter 3.22.2 has solved the problem.