iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
0
Mobile Development

Flutter App 開發實戰系列 第 25

客製功能 DragTarget | 位置修正[Day 25]

在昨天成功做出拖曳放置位置的元件後,發現元件放置後出現的位置跟本來預想的不同,猜測可能的原因有可能是在放置時讀取到的位置是整個畫面的位置,所以才與放置時的地方不同,延續這個思路我們一起來解決這個問題吧。


位置修正

在 FrameState 中新增一個 fixRect 的方法,透過 RenderObject的 globalToLocal 方法我們可以得到這個context 相對於螢幕中的位置中某個位置

class FrameState extends State<Frame> {
...
...
  Rect fixRect(BuildContext context, DraggableInfo info) {
    double width = 100;
    double height = 100;

    RenderBox box = context.findRenderObject();
    Offset center = box.globalToLocal(Offset(info.dx+width/2, info.dy+height/2));
    return Rect.fromCenter(
      center: center,
      width: width,
      height: height,
    );
  }
... 
...
  @override
  Widget build(BuildContext context) {

    List<Widget>  children = List.generate(data.length, (index) {

      var draggableBtn = RaisedButton(child: Text(data[index].text) ,onPressed: (){},);
      Rect rect = fixRect(context, data[index]) ; //取得 context 中的位置
      return Positioned.fromRect(
          rect: rect ,
          child: draggableBtn
      );
    });

    children.insert(0,Positioned.fill(child: Container(color: Colors.grey,)));

    return Stack(
      fit: StackFit.expand,
      children:children,
    ) ;
  }
  
}

globalToLocal 圖例

https://ithelp.ithome.com.tw/upload/images/20200926/201301272O2GEQBGC2.png

透過簡易的修改我們成功讓按鈕顯示在正確的位置上了
https://ithelp.ithome.com.tw/upload/images/20200926/20130127hwkXVesfc8.png

慢慢的把一些功能都補齊了,之後的篇章應該還是在自訂元件這邊,因為真的有這個需求要處理哈哈,之後還有對齊、邊線、放大縮小等等功能希望能在30天內完結。


上一篇
客製功能 DragTarget | 實作 [Day 24]
下一篇
客製功能 CustomPainter | 範例 [Day 26]
系列文
Flutter App 開發實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言