【发布时间】:2019-09-30 09:58:35
【问题描述】:
我正在开发一个需要基于点击坐标定位的自定义叠加层的应用。然后覆盖应该填充该位置的其余空间。填充空间方向基于从点击点到顶部或底部的距离,使用距离较大的方向,并且应在点击其表面外时关闭。
我查看了Overlay Widget,但我似乎不明白如何使用它来实现所描述的属性。
到目前为止,我已经创建了一个包含 Overlay 描述的 StatefulWidget。
class ScriptureDisplay extends StatefulWidget {
@override
_ScriptureDisplayState createState() => _ScriptureDisplayState();
}
class _ScriptureDisplayState extends State<ScriptureDisplay> {
OverlayEntry _overlayEntry;
OverlayEntry _createOverlayEntry() {
RenderBox renderBox = context.findRenderObject();
var size = renderBox.size;
var offset = renderBox.localToGlobal(Offset.zero);
return OverlayEntry(
builder: (context) => Positioned(
left: offset.dx,
top: offset.dy + size.height + 5.0,
width: size.width,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
nip(),
body(context, offset.dy),
],
),
));
}
@override
Widget build(BuildContext context) {
return RaisedButton(
child: Text("Click Me"),
onPressed: (){
this._overlayEntry = this._createOverlayEntry();
Overlay.of(context).insert(this._overlayEntry);
},
);
}
Widget body(BuildContext context, double offset) {
return Material(
borderRadius: BorderRadius.all(
Radius.circular(8.0),
),
// color: this.color,
elevation: 4.0,
child: Container(
width: MediaQuery.of(context).size.width,
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: ListView(
padding: EdgeInsets.zero,
shrinkWrap: true,
children: ["First", "Second", "Third"]
.map((String s) => ListTile(
subtitle: Text(s),
))
.toList(growable: false),
),
),
);
}
Widget nip() {
return FittedBox(
child: Container(
height: 20.0,
width: 20.0,
margin: EdgeInsets.only(left:10),
child: CustomPaint(
painter: OpenPainter(),
),
),
);
}
}
【问题讨论】:
-
您有什么问题?你是如何创建你的
OverlayEntry的?它的builder是什么样的? -
"So how do i pickup and calculate current click point relative to the entire screen so i can make the decision for the Overlay direction."- 使用Listener小部件 -
哪种监听器最适合这个?
-
这个Listener