Dapatkah seseorang yang berpengalaman dalam menggunakan CustomSingleChildLayout
dan CustomMultiChildLayout
kelas dapat menjelaskan secara detail (dengan contoh) tentang cara menggunakannya.
Saya baru mengenal Flutter dan berusaha memahami cara menggunakannya. Namun, dokumentasinya mengerikan dan tidak jelas. Saya mencoba menjelajahi internet untuk contoh, tetapi tidak ada dokumentasi lain.
Saya akan sangat berterima kasih jika Anda bisa membantu.
Terima kasih!
flutter
dart
flutter-layout
Walter M.
sumber
sumber
Jawaban:
Pertama-tama, saya ingin mengatakan bahwa saya senang membantu Anda dengan ini karena saya dapat memahami perjuangan Anda - ada manfaat untuk mengatasinya sendiri (dokumentasi luar biasa).
Apa yang
CustomSingleChildLayout
akan jelas setelah saya jelaskanCustomMultiChildLayout
kepada Anda.CustomMultiChildLayout
Titik widget ini memungkinkan Anda untuk tata letak anak-anak Anda lulus untuk widget ini dalam satu fungsi, yaitu posisi dan ukuran mereka dapat bergantung satu sama lain, yang merupakan sesuatu yang Anda tidak dapat mencapai menggunakan misalnya yang prebuilt
Stack
widget.Sekarang, ada dua langkah lagi yang perlu Anda ambil sebelum mulai menata anak-anak Anda:
children
haruslah seorangLayoutId
dan Anda lewati widget yang sebenarnya ingin Anda tunjukkan sebagai seorang anakLayoutId
. Secaraid
unik akan mengidentifikasi widget Anda, membuatnya dapat diakses saat meletakkannya:MultiChildLayoutDelegate
subclass yang menangani bagian tata letak. Dokumentasi di sini tampaknya sangat rumit.Sekarang, semua pengaturan selesai dan Anda dapat mulai menerapkan tata letak yang sebenarnya. Ada tiga metode yang dapat Anda gunakan untuk itu:
hasChild
, yang memungkinkan Anda memeriksa apakah id tertentu (ingatLayoutId
?) diteruskan kechildren
, yaitu jika ada anak dari id itu.layoutChild
, yang perlu Anda panggil untuk setiap id , setiap anak, diberikan tepat satu kali dan itu akan memberi AndaSize
anak itu.positionChild
, yang memungkinkan Anda untuk mengubah posisi dariOffset(0, 0)
ke offset apa pun yang Anda tentukan.Saya merasa konsepnya harus cukup jelas sekarang, itulah sebabnya saya akan menggambarkan bagaimana menerapkan delegasi sebagai contoh
CustomMultiChildLayout
:Dua contoh lain adalah satu dari dokumentasi (periksa langkah persiapan 2 ) dan contoh dunia nyata yang saya tulis beberapa waktu lalu untuk
feature_discovery
paket:MultiChildLayoutDelegate
implementasi danCustomMultiChildLayout
dalambuild
metode .Langkah terakhir adalah mengganti
shouldRelayout
metode , yang mengontrol sederhana apakahperformLayout
harus dipanggil lagi pada suatu titik waktu tertentu dengan membandingkan dengan delegasi lama, (opsional Anda juga dapat menimpagetSize
) dan menambahkan delegasi ke AndaCustomMultiChildLayout
:Pertimbangan
Saya menggunakan
1
dan2
sebagai id dalam contoh ini, tetapi menggunakanenum
mungkin merupakan cara terbaik untuk menangani id jika Anda memiliki id tertentu.Anda dapat meneruskan
Listenable
kesuper
(mis.super(relayout: animation)
) Jika Anda ingin menghidupkan proses tata letak atau memicunya berdasarkan yang dapat didengarkan secara umum.CustomSingleChildLayout
Dokumentasi menjelaskan apa yang saya jelaskan di atas dengan sangat baik dan di sini Anda juga akan melihat mengapa saya mengatakan itu
CustomSingleChildLayout
akan sangat jelas setelah memahami caraCustomMultiChildLayout
kerjanya:Ini juga berarti bahwa menggunakan
CustomSingleChildLayout
mengikuti prinsip yang sama yang saya jelaskan di atas, tetapi tanpa id karena hanya ada satu anak.Anda harus menggunakan
SingleChildLayoutDelegate
, yang memiliki metode berbeda untuk menerapkan tata letak (semuanya memiliki perilaku default, sehingga secara teknis semuanya opsional untuk ditimpa ):getConstraintsForChild
, yang setara dengan batasan yang saya berikan dilayoutChild
atas.getPositionForChild
, yang setara dengan dipositionChild
atas.Semua yang lain persis sama (ingat bahwa Anda tidak perlu
LayoutId
dan hanya memiliki satu anak, bukanchildren
).MultiChildRenderObjectWidget
Inilah yang
CustomMultiChildLayout
dibangun.Menggunakan ini membutuhkan pengetahuan yang lebih dalam tentang Flutter dan sekali lagi sedikit lebih rumit, tetapi itu adalah pilihan yang lebih baik jika Anda ingin lebih banyak penyesuaian karena ini bahkan lebih rendah. Ini memiliki satu keunggulan utama dibandingkan
CustomMultiChildLayout
(umumnya, ada lebih banyak kontrol):CustomMultiChildLayout
tidak dapat mengukur sendiri berdasarkan anak-anaknya (lihat masalah tentang dokumentasi yang lebih baik untuk alasannya ).Saya tidak akan menjelaskan cara menggunakan di
MultiChildRenderObjectWidget
sini karena alasan yang jelas, tetapi jika Anda tertarik, Anda dapat memeriksa kiriman saya ke tantangan Flutter Clock setelah 20 Januari 2020, di mana saya menggunakanMultiChildRenderObjectWidget
secara luas - Anda juga dapat membaca artikel tentang ini , yang seharusnya menjelaskan sedikit tentang bagaimana semua itu bekerja.Untuk saat ini Anda dapat mengingat bahwa
MultiChildRenderObjectWidget
itulah yangCustomMultiChildLayout
memungkinkan dan menggunakannya secara langsung akan memberi Anda beberapa manfaat bagus seperti tidak harus menggunakanLayoutId
dan sebagai gantinya dapat mengaksesRenderObject
data induk 's secara langsung.Fakta yang menyenangkan
Saya menulis semua kode dalam teks biasa (dalam bidang teks StackOverflow), jadi jika ada kesalahan, harap tunjukkan kepada saya dan saya akan memperbaikinya.
sumber
LayoutId
menjadi unik secara global atau lokal? global yaitu apakah widget saudara kandungCustomMultiChildLayout
memerlukan memiliki yang berbedaLayoutId
pada anak-anak mereka.LayoutId
, yang berarti bahwa data ini, id, hanya akan diakses oleh induk langsung :)CustomMultiChildLayout
sangat berguna dalam skenario di mana Anda perlu untuk kelompok auto-resize beberapa widget Teks dalamColumn
dariRow
's, untuk contoh.