我有以下几点TextFormField:
TextFormField(
focusNode: inputFocusNode,
keyboardType: TextInputType.multiline,
maxLines: null,
minLines: 3,
)
Run Code Online (Sandbox Code Playgroud)
当文本字段处于焦点时,键盘出现。当按下手机后退按钮时,键盘会消失,但文本字段上的光标仍然存在。
我知道你可以FocusScope.of(context).unfocus()用来移除光标或取消焦点。然而,似乎没有一种直接的方法来检测键盘关闭而不获得包裹
我该如何解决这个问题?
用这个小部件包裹您的整个应用程序。
Listener(
onPointerDown: (_) {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus &&
currentFocus.focusedChild != null) {
currentFocus.focusedChild.unfocus();
}
},
child: //MyApp()
)
Run Code Online (Sandbox Code Playgroud)
每当用户点击其他任何地方时,它也会删除焦点和光标。
小智 7
作为一个选项,您可以监听窗口指标的变化。
WidgetsBindingObserver向 State 类添加接口didChangeMetrics方法initState和dispose方法查看完整代码:
import 'package:flutter/material.dart';
void main() {
runApp(MaterialApp(home: Scaffold(body: Home())));
}
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> with WidgetsBindingObserver {
final FocusNode inputFocusNode = FocusNode();
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
Widget build(BuildContext context) {
return Center(
child: TextFormField(
focusNode: inputFocusNode,
keyboardType: TextInputType.multiline,
maxLines: null,
minLines: 3,
),
);
}
@override
void didChangeMetrics() {
super.didChangeMetrics();
final value = WidgetsBinding.instance.window.viewInsets.bottom;
if (value == 0) {
inputFocusNode.unfocus();
}
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
inputFocusNode.dispose();
super.dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我将其发布为答案,因为由于我的回购协议,我仍然无法发表评论。对我来说,@user10539074 的解决方案不起作用,因为它不让文本字段仅获得焦点(键盘在尝试打开时立即关闭)。所以我添加了这条额外的线,它对我有用。
if (MediaQuery.of(context).viewInsets.bottom != 0)
{
if (value == 0) {
inputFocusNode.unfocus();
}
}
Run Code Online (Sandbox Code Playgroud)
此检查的基本作用是仅在键盘已打开时才运行该代码。
| 归档时间: |
|
| 查看次数: |
2914 次 |
| 最近记录: |