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);
}
}
这与我的解决方案相同,但隐藏在扩展方法中。