Flutter Drag&Drop

Furkan Olkay
Flutter Türkiye
Published in
4 min readFeb 2, 2022
Flutter Drag & Drop

Merhabalar 👋 Bu yazımda Flutter’da Drag&Drop işlemlerini nasıl yapabileceğimizi anlatacağım.

Aslında temelde Drag&Drop işlemleri için 2 ana widget kullanıyoruz.

Draggable: Bu widget sürükleyebildiğimiz kısımdır ve burada sürüklemek istediğimiz widgetları tanımlıyoruz.

DragTarget: Bu widget ise sürekleyebildiğimiz widgetı kabul eden kısımdır burada gerekli durum kontrolleriyle draggable widgetları kabul edebiliriz.

Drag&Drop’lar genel olarak uygulamalarda bazı kolaylıklar ve kullanım kolaylıkları sağlar. Örneğin kullanıcı tarafından sıralanabilir bir liste oluşturmak istediğimizde bunu kendimiz yapmak istersek Draggable ve DragTarget kullanarak oldukça kolay bir şekilde yapabiliriz. Aksi halde paket kullanmak zorunda kalacağız. Zorunda olmadıkça projelerime paket yükü almayı sevmem. Sanıyorum herkes böyle düşünüyordur.

Hadi Başlayalım!

Drag & Drop için kullanacağımız widgetları ayrıntılı inceleyebilmek adına bir senaryo oluşturdum. Hani o barbie giydirme oyunları var ya onlara benzetebiliriz 😂

İki farklı targetimiz olacak. Bir tanesi vücudun üst kısmını hedef alacak, diğeri ise alt kısmını yani üstümüze Tshirt giyerken altımıza Jean giyeceğiz.

Öncelikle vücudun kısımlarını tanımlayalım.

Alt Kısım

Vücudun üst kısmınıda aynı şekilde UpperBody olarak tanımlıyoruz.

Şimdide bu sınıflardan kalıtacağımız bir kaç tane kıyafet yapalım. Vücudun üst kısmına giyilebilecekleri UpperBody’den alt kısıma giyilenleri LowerBody’den kalıtacağız.

Tshirt

Aynı Şekilde UpperBody’den Hoodie ve LowerBody’den Jean, Trousers oluşturuyoruz.

Draggables

Şimdi mock bir repository oluşturalım.

mock repository

Datalarımızda hazır olduğuna göre arayüze ve Draggable widgetımızı oluşturabiliriz.

Widgetın içersine farklı tipte kıyafetler koyabileceğimiz için Widgetımızı Generic olarak oluşturuyoruz. Draggle ve LongPressDraggable olarak iki farklı Draggable var burada istediğimizi kullanabiliriz. Draggable olarak direkt tanımlamış olduğumuz Scroll kullandığımız durumlarda sorunlar yaratabilir bu durumlarda LongPress’i tercih etmek daha doğru olacaktır. LongPressDraggable’da press için delay set edebilme şansımız var.

Draggable widget içerisinde bulunan child bilindiği üzere ana tasarımlı widgetımızı alır, feedback’de içerisine widget alır ve taşıma sırasında elimizdeki widgetın tasarımında değişiklikler yapabiliriz. Ayrıca childWhenDragging’te ise taşıma sırasında sabit duran Draggable tasarımını farklı bir şekilde gösterebiliriz. Draggable widgetının axis özelliği sürükleme hareketlerinin yönünü belirlememize, hareket yönünü sınırlamamıza olanak sağlıyor.

DraggableWidget

Son olarak kritik olarak bahsedebileceğim taşıma işleminin başlaması, bitmesi ya da iptal edilmesi gibi durumları tetikleyen fonksiyonlara da sahiptir.

İçerisine göndermiş olduğumuz model’i Draggable içerisinde bulunan data kısmına koyuyoruz. Bu şekilde sürükleme eventleri sırasında içerisinde bulunan dataya erişerek DragTargetlerde bu datayı işleyebiliriz.

Şimdi bu DraggableWidget’ımızı kullanarak bir Gardrop widgetı oluşturalım.

Oluşturduğumuz örnek kıyafetleri repositoryden alarak bir widgetın içerisinde bu şekilde oluşturuyoruz.

Draggable

Gardrobumuzu da oluşturduğumuza göre gelelim DragTarget olayına. Şimdiye kadar sürüklenebilir widgetlerımızı oluşturduk. Bunları sürükleyeceğimiz alan ise DragTarget tarafından oluşturulacak. Hadi Targetlerimizin bulunduğu widgetımızı yazalım.

DragTargets
DragTarget LowerBody

LowerBody DragTarget’imizi oluşturduk. DragTargetin onAccept kısmında kabul edildiğinde yapmasını istediğimiz işleri yaptırıyoruz ben örnekte kıyafetin imageUrl’ini aldım ve DragTarget görünümüne koydum böylelikle sürüklemiş olduğumuz Draggable widgetımızın görselini DragTarget üzerinde görebiliyoruz. Aynı şekilde UpperBody ‘i de oluşturmalıyız.

Oluşturmuş olduğumuz Draggable widgetlar içerisine farklı kıyafet türleri alıyordu. Aldığı bu türler UpperBody ve LowerBody üzerinden kalıtılmış türlerdi. Oluşturduğumuz DragTargetlerinde UpperBody ve LowerBody tipini kabul edebiliyor olması UpperBody tarafının Hoodie, Tshirt ve LowerBody tarafının Jean, Trousers gibi subclassları kabul etmesine olanak sağlar.

DragTarget için çok farklı kontrol vardır. Genellikle onWillAccept ile üzerine sürüklediğimiz Draggable widgetları bırakmadan gerekli işler yaptırabiliriz. Draggable widgetla DragTarget üzerinde gezerken Move fonksiyonu sürekli olarak tetiklenir ya da Target alanından çıktığımızda onLeaved fonksiyonun tetiklendiğini görebiliriz. Bunlar için özel işler yazmamız gerekebildiğinden bunlar oldukça kritiktir.

Ayrıca içerisinde kullandığım _clothesWidet’ı da yazıyoruz.

_clothesWidget

Gerekli bütün alanları oluşturduk. Appimizi şimdi ayağa kaldırıp neler yaptığımıza bakabiliriz.

İşte Demomuz!

Demo

Özetlemek gerekirse 2 adet Target oluşturduk ve bu targetlere farklı Draggable widgetları sürükledik ve farklı aksiyonlar aldık. Kendi tipinde(Kalıtılmış) olan Draggableları kabul ederek imageUrl’lerini aldı. Farklı bir generic tipte Draggable sürüklediğimizde ise kendi subclassı olmadığı için widgetı kabul etmedi.

Drag & Drop eventini detaylı bir şekilde anlatmaya çalıştım umarım sıkılmadan okumuşsunuzdur 🤓

Projenin sayfalara ait kodlarını direkt olarak paylaşmak yerine önemli olan noktaları paylaşmayı tercih ettim ama projenin tamamının kaynak kodunu burada bulabilirsiniz.

Twitter: FurkayOlkay

Github: github.com/furkay

--

--