Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 检测小部件在颤振中何时改变位置_Dart_Flutter - Fatal编程技术网

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”的变量。