我有以下TextFormField
:
TextFormField(
focusNode: inputFocusNode,
keyboardType: TextInputType.multiline,
maxLines: null,
minLines: 3,
)
当文本字段成为焦点时,出现键盘。当按下电话后退按钮时,键盘消失,但是文本字段上的光标仍然保留。
我知道您可以使用FocusScope.of(context).unfocus()
删除光标或使焦点散焦。但是,似乎没有一种直接的方法可以在没有得到package
我该如何解决这个问题?
答案 0 :(得分:3)
作为一种选择,您可以监听窗口指标的变化。
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();
}
}
答案 1 :(得分:1)
用这个小部件包裹你的整个应用。
Listener(
onPointerDown: (_) {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus &&
currentFocus.focusedChild != null) {
currentFocus.focusedChild.unfocus();
}
},
child: //MyApp()
)
每当用户点击其他任何地方时,它也会移除焦点和光标。
答案 2 :(得分:0)
您可以检查是否可见键盘,当看不见键盘时,您可以调用unfocus()
方法。例如,要跟踪键盘,可以使用此库keyboard_visibility。示例代码:
FocusNode myFocusNode = FocusNode();
KeyboardVisibilityNotification().addNewListener(
onChange: (bool visible) {
if (!visible) {
myFocusNode.unfocus()
}
},
);