Dart 检测小部件在颤振中何时改变位置
有什么方法可以检测小部件何时改变位置?例如,当键盘弹出,内容向上移动时?我希望在不依赖焦点事件或试图检测键盘状态的情况下检测此问题 下面是一个示例应用程序:Dart 检测小部件在颤振中何时改变位置,dart,flutter,Dart,Flutter,有什么方法可以检测小部件何时改变位置?例如,当键盘弹出,内容向上移动时?我希望在不依赖焦点事件或试图检测键盘状态的情况下检测此问题 下面是一个示例应用程序: import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) {
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: MyTextField()
)
)
);
}
}
class MyTextField extends StatelessWidget {
@override
Widget build(BuildContext context) {
return TextField();
}
}
当聚焦时,如何检测
MyTextField
何时上移?您可以使用WidgetsBindingObserver
来检测指标何时变化,这里有一个示例,但您必须使用GlobalKey来检查小部件的新位置:
class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
GlobalKey _key = GlobalKey();
@override
void initState() {
WidgetsBinding.instance.addObserver(this);
super.initState();
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeMetrics() {
final RenderBox renderBox = _key.currentContext.findRenderObject();
final position = renderBox.localToGlobal(Offset.zero);
print("position : ${position.dx},${position.dy}");
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: MyTextField(
key: _key,
),
),
);
}
}
class MyTextField extends StatelessWidget {
const MyTextField({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return TextField();
}
}
class\u MyHomePageState使用WidgetsBindingObserver扩展状态{
GlobalKey _key=GlobalKey();
@凌驾
void initState(){
WidgetsBinding.instance.addObserver(这个);
super.initState();
}
@凌驾
无效处置(){
WidgetsBinding.instance.removeObserver(此);
super.dispose();
}
@凌驾
void didChangeMetrics(){
final RenderBox RenderBox=_key.currentContext.finderObject();
最终位置=renderBox.localToGlobal(偏移量为0);
打印(“position:${position.dx},${position.dy}”);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:中(
孩子:MyTextField(
键:_键,
),
),
);
}
}
类MyTextField扩展了无状态小部件{
常量MyTextField({Key}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回TextField();
}
}
如果您只想知道键盘是否可见,可以使用以下方法:
导入“dart:ui”;
进口“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类_MyAppState使用WidgetsBindingObserver扩展状态{
@凌驾
void initState(){
super.initState();
WidgetsBinding.instance.addObserver(这个);
}
@凌驾
无效处置(){
WidgetsBinding.instance.removeObserver(此);
super.dispose();
}
@凌驾
void didChangeMetrics(){
打印('键盘可见吗?${window.viewInsets.bottom!=0?'yes':'no'}');
}
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
正文:中(
子项:TextField(),
),
),
);
}
}
解释:通过获取应用程序所绘制矩形的底部位置,可以推断系统组件是否减少了应用程序的空间,从而判断键盘是否可见
这只回答了您问题的这一部分:
例如,当键盘弹出,内容向上移动时
但至少绘制应用程序的矩形的大小始终是当前的,而不是旧的大小。这就是@diegoveloper的答案的问题,你总是会得到
文本字段的旧位置
嘿,我认为这是可行的,但我相信在didChangeMetrics
中打印的位置实际上是文本字段的旧位置,在它改变位置之前。有没有一种方法可以获得新的职位?它只在窗口度量发生变化时起作用,而不是在小部件的状态发生变化时起作用position@diegoveloper我得到的类型为“RenderObject”的值无法分配给类型为“RenderBox”的变量。