Flutter 获取一个小部件相对于另一个小部件的位置

Flutter 获取一个小部件相对于另一个小部件的位置,flutter,Flutter,有没有更好的方法来获取一个小部件相对于另一个小部件的位置 GlobalKey\u key=GlobalKey(); GlobalKey _keyRoot=GlobalKey(); RenderBox=_key.currentContext.FindEnderObject(); 偏移位置=box.localToGlobal(Offset.zero); RenderBox box2=_keyRoot.currentContext.FindEnderObject(); 偏移位置2=box2.local

有没有更好的方法来获取一个小部件相对于另一个小部件的位置

GlobalKey\u key=GlobalKey();
GlobalKey _keyRoot=GlobalKey();
RenderBox=_key.currentContext.FindEnderObject();
偏移位置=box.localToGlobal(Offset.zero);
RenderBox box2=_keyRoot.currentContext.FindEnderObject();
偏移位置2=box2.localToGlobal(偏移量为零);
双x=位置.dx-位置2.dx;
双y=位置.dy-位置2.dy;
此外,我希望该职位由左下角给出


您以前做过吗?

您可以创建GlobalKey的扩展以返回小部件的位置:

extension GlobalKeyEx on GlobalKey {
  Offset get globalPosition {
    final RenderBox box = currentContext?.findRenderObject();
    return box?.localToGlobal(Offset.zero);
  }
}
然后你计算距离的方法与你之前写的相似:

double x = _key1.globalPosition.dx - _key2.globalPosition.dx;
double y = _key1.globalPosition.dy - _key2.globalPosition.dy;
下面是一个示例应用程序来演示它:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark(),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatefulWidget {@override
  createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  final key1 = GlobalKey();
  final key2 = GlobalKey();
  var message = "Tap the button";
  
  @override
  Widget build(BuildContext context) {       
    return Stack(
      children: <Widget>[
        Positioned(
          key: key1,
          top: 120,
          left: 40,
          child: Text("Widget 1"),
        ),
        Positioned(
          key: key2,
          top: 150,
          left: 100,
          child: Text("Widget 2"),
        ),
        Positioned(
          top: 200,
          left: 10,
          child: RaisedButton(            
            child: Text("Tap me"),
            onPressed: () {
              // Compute the distance between the two widgets
              var x = key1.globalPosition.dx - key2.globalPosition.dx;
              var y = key1.globalPosition.dy - key2.globalPosition.dy;
              
              // we show the absolute distance between the widgets
              setState(() => message = "The distance is X: ${x.abs()}, Y: ${y.abs()}");
            },
          ),
        ),
        Positioned(
          top: 250,
          left: 10,
          child: Text(message),
        ),
      ],
    ); 
  }
}

extension GlobalKeyEx on GlobalKey {
  Offset get globalPosition {
    final RenderBox box = currentContext?.findRenderObject();
    return box?.localToGlobal(Offset.zero);
  }
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:ThemeData.dark(),
debugShowCheckedModeBanner:false,
家:脚手架(
正文:中(
子项:MyWidget(),
),
),
);
}
}
类MyWidget扩展StatefulWidget{@override
createState()=>\u MyWidgetState();
}
类_MyWidgetState扩展状态{
最终键1=全局键();
最终键2=全局键();
var message=“点击按钮”;
@凌驾
小部件生成(BuildContext上下文){
返回堆栈(
儿童:[
定位(
键:键1,
排名:120,
左:40,,
子项:文本(“小部件1”),
),
定位(
键:键2,
排名:150,
左:100,,
子项:文本(“小部件2”),
),
定位(
前200名,
左:10,,
孩子:升起按钮(
孩子:文本(“点击我”),
已按下:(){
//计算两个小部件之间的距离
var x=key1.globalPosition.dx-key2.globalPosition.dx;
变量y=key1.globalPosition.dy-key2.globalPosition.dy;
//我们显示了小部件之间的绝对距离
setState(()=>message=“距离是X:${X.abs()},Y:${Y.abs()}”);
},
),
),
定位(
排名:250,
左:10,,
子:文本(消息),
),
],
); 
}
}
GlobalKey上的GlobalKeyEx扩展{
偏移获取全局位置{
final RenderBox=currentContext?.findRenderObject();
返回框?.localToGlobal(偏移量为0);
}
}

我将解决方案放在外部类中

类Utils{ 静态偏移量getPositionBottomLeft(全局键parentKey、全局键childKey){ final parentBox=parentKey.currentContext.findenderObject()作为RenderBox; final parentPosition=parentBox.localToGlobal(Offset.zero); 最终parentHeight=parentBox.size.height; final childBox=childKey.currentContext.finderObject()作为RenderBox; final childPosition=childBox.localToGlobal(Offset.zero); 最终childHeight=childBox.size.height; 最终x=childPosition.dx-parentPosition.dx; 最后的y= (childPosition.dy+childHeight-parentPosition.dy-parentHeight) .abs(); 返回偏移量(x,y); } }
这与我的解决方案相同,但隐藏在扩展方法中。