dart - 检测小部件何时在 Flutter 中更改位置
问题描述
有什么方法可以检测小部件何时更改位置?比如键盘弹起,内容上移的时候?我想在不依赖焦点事件或尝试检测键盘状态的情况下检测到这一点。
这是一个示例应用程序:
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 来检查 Widget 的新位置:
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();
}
}
推荐阅读
- excel - Excel如何从单列搜索结果中抓取整行数据
- angular - Angular:如何访问索引 - 数组中的键值
- io - 有没有办法在不使用该模块中的函数的情况下打印模块类型?
- xamarin.forms - Picker 的 ItemDisplayBinding 的 MultiBinding 在添加新项目时抛出 Null 引用异常
- python - Vscode - .env 文件中的变量扩展
- c# - 在画布前对游戏对象进行排序
- c++ - 从二维网格上的一点向外遍历的好算法是什么?
- python - 如何在不附加先前输入的情况下合并和关闭 PyPDF
- sql - 如何在sql中的表中获取最多一个日期
- bash - VS 代码扩展:远程 - SSH。如何为连接指定 ssh 命令