BerandaComputers and TechnologyKoleksi dan objek yang tidak dapat diubah untuk Flutter dan Dart

Koleksi dan objek yang tidak dapat diubah untuk Flutter dan Dart

Kekekalan adalah prinsip yang diketahui baik dari rekayasa perangkat lunak. Apa pun yang tidak perlu diubah setelah dibuat, seharusnya tidak. Anda mendapatkan banyak manfaat dengan pendekatan ini, antara lain, lebih sedikit bug karena ada sesuatu yang berubah secara tidak sengaja dan keamanan thread menjadi “gratis”.

Jadi agak menyedihkan bahwa Dart (dan dengan ekstensi Flutter) tidak memiliki dukungan bawaan untuk objek dan koleksi yang tidak dapat diubah.

Itu bukan masalah besar karena built_collection dan paket nilai_bangun ada. Dengan 2 baris tambahan dalam daftar ketergantungan Anda, Anda mendapatkan koleksi yang tidak dapat diubah dan objek yang tidak dapat diubah masing-masing.

Saya akan memberikan gambaran umum yang sangat ringkas tentang penggunaan kedua paket. Lihat dokumentasi masing-masing untuk contoh dan fitur tambahan.

Set up

Tambahkan ini ke pubspec.yaml Anda (centang built_collection dan built_value untuk versi terbaru).

  ketergantungan:   built_collection: ^ 4.3.2   nilai_bangun: ^ 7.1.0  

Koleksi yang tidak dapat diubah

Penawaran BuiltList , BuiltSet , BuiltMap yang setara dengan SDK tetapi setelah dibuat tidak dapat berubah (mutasi ). Gunakan metode ekstensi yang nyaman untuk membuatnya dari padanan yang bisa berubah.

  impor 'paket: built_collection / built_collection.dart';  final builtList=[1, 2, 3]. build (); final builtSet={1, 2, 3} .build (); final builtMap={1: 'one', 2: 'two', 3: 'three'}. build ();  

Untuk mengubah koleksi yang tidak dapat diubah, panggil toBuilder () untuk mendapatkan versi yang bisa berubah. Setelah Anda selesai dengan perubahan Anda, panggil build () lagi untuk membuatnya tetap.

  paket impor: built_collection / built_collection. anak panah';  final listBuilder=builtList.toBuilder (); listBuilder.addAll ([4, 5, 6]); final newBuiltList=listBuilder.build ();  

Perhatikan bahwa build_collection tidak mengimplementasikan antarmuka setara yang dapat berubah. Misalnya, metode yang menerima Daftar tidak akan dapat menerima BuiltList . Jika Anda ingin menerima keduanya, leluhur yang sama adalah Iterable .

Hal lain dari koleksi ini adalah bahwa mereka sebanding dan dapat di-hash- of the box (berbeda dengan rekan-rekan mereka yang bisa berubah). Terakhir, null tidak diperbolehkan di salah satu koleksi ini.

Objek yang tidak bisa diubah

Ini untuk membuat kelas nilai data (mirip dengan kelas data Kotlin ). Ini menggunakan pembuatan kode, jadi Anda perlu menyertakan file yang dihasilkan dalam impor Anda menggunakan bagian pernyataan. Boilerplate agak bertele-tele, tetapi menyelesaikan pekerjaan.

  impor 'paket: built_value / built_value.dart';  bagian 'my_data.g.dart';  kelas abstrak MyData     mengimplementasikan Dibangun  {    String mendapatkan nama;      int mendapatkan usia;      pabrik MyData (Nama string, usia int)=> _ $ MyData ._ (nama: nama, usia: usia);      Data saya._(); }  
my_data.dart

Untuk objek yang lebih kompleks / lebih besar, cukup berikan antarmuka pembangun secara langsung. Perhatikan bahwa secara default, menyetel nilai ke null tidak diperbolehkan kecuali jika secara eksplisit menganotasi bidang dengan tepat. Terakhir, Anda dapat mengonversi nilai_bangun yang tidak dapat diubah menjadi bentuk yang dapat diubah dengan memanggil toBuilder () .

  import 'package: built_value / built_value.dart';  bagian 'my_data.g.dart';  kelas abstrak MyOtherData mengimplementasikan Built  {    String mendapatkan nama;      int mendapatkan usia;      @bayu_joo   String mendapatkan komentar;    pabrik MyOtherData ([void Function(MyOtherDataBuilder) updates])=      _ $ MyOtherData;          MyOtherData ._ (); }  [...]  // Tidak perlu menyetel bidang yang bisa berubah, ini akan disetel ke null secara default final nullIfNotSet=MyOtherData ((b)=> b   ..name='Tom'   ..age=23);  // Ubah yang tidak dapat diubah, menjadi dapat berubah, dan kembali menjadi tidak dapat diubah terakhir bisa berubah=nullIfNotSet.toBuilder (); builder.comment='Halo dunia'; final immutable=builder.build ();  // Kesetaraan, kode hash, dan toString yang dibuat secara otomatis. assert (nullIfNotSet!=tidak dapat diubah);  
my_other_data.dart

Sekarang, Anda sudah punya pemahaman tentang cara menggunakan koleksi dan objek yang tidak dapat diubah di aplikasi Flutter Anda. Ingatlah bahwa ini hanya menggores permukaan paket-paket ini (mis. Buit_value menawarkan serializers / deserializers). Lihat dokumen masing-masing untuk lebih lanjut.

Selamat membuat kode!

Read More

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments