重现步骤
1.使用下面的代码构建一个应用程序。
2.打开应用程序(使用三星A33测试)
3.单击“显示键盘”按钮时也看到键盘未显示
4.手动聚焦文本字段 - 现在将显示键盘。
5.隐藏键盘
6.再次按下“显示键盘”按钮,你会看到这次显示了键盘
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
class BestHome extends StatefulWidget {
const BestHome({super.key});
@OverRide
// ignore: library_private_types_in_public_api
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State {
late FocusNode _focusNode;
void _showKeyboard() {
FocusScope.of(context).requestFocus(_focusNode);
}
@OverRide
void initState() {
super.initState();
focusNode = FocusNode();
SchedulerBinding.instance.addPostFrameCallback(() {
Timer(const Duration(milliseconds: 1000), () {
_focusNode.requestFocus();
});
});
}
@OverRide
void dispose() {
_focusNode.dispose();
super.dispose();
}
@OverRide
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
autofocus: true,
focusNode: _focusNode,
decoration: const InputDecoration(
hintText: 'Start typing...',
),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _showKeyboard,
child: const Text('Show Keyboard'),
),
],
),
),
);
}
}
最可能的原因是,当您调用
Textfield
时,_focusNode.requestFocus();
已经获得焦点。在这种情况下,再次请求焦点不会导致焦点改变,并且不会使键盘可见。
最简单的解决方案是手动打开键盘
void _showKeyboard() {
_focusNode.requestFocus();
SystemChannels.textInput.invokeMethod('TextInput.show');
}