Apakah memperluas widget benar-benar merupakan antipattern?

Aug 20 2020

Saya telah membaca di beberapa tempat bahwa memperluas widget Flutter adalah anti-pola. Benarkah itu?

Saya telah menggunakan subclass widget untuk mengurangi nesting dengan membuat subclass widget yang saya hapus dan meletakkan widgetnya di konstruktornya, seperti itu

class Foo extends FormBuilder {
    Foo() : super (
        // bunch of widgets here
    );
}

Memperluas widget tanpa kewarganegaraan tampaknya lebih populer, tetapi ia menambahkan beberapa baris kode dan widget ke pohon, yang bukan preferensi saya:

class Foo extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
    return FormBuilder(
       // bunch of widgets here
    );
}

Saya telah membaca mengembalikan widget dari suatu fungsi adalah antipattern karena merusak pengoptimalan rendering . Apakah pendekatan pertama saya juga memiliki efek samping tersembunyi? Yaitu, apakah itu benar-benar antipattern?

Jawaban

3 kuhnroyal Aug 20 2020 at 20:22

Memperluas status widget dapat menyebabkan masalah karena statusnya diketik ke superclass dan Anda tidak dapat memperluas statusnya karena sebagian besar kelas status tetap bersifat pribadi. Banyak metode pencarian seperti BuildContext.findAncestorStateOfType()berpotensi gagal.

Memperluas widget stateless seharusnya berfungsi dalam banyak kasus tetapi tidak disarankan, karena Anda telah menemukannya.

Secara umum, dengan seluruh sifat reaktif dan widget Flutter, prinsip komposisi melebihi pewarisan adalah pola yang baik untuk diikuti.

Anda menyusun widget menjadi widget baru menjadi widget baru menjadi widget baru menjadi widget baru ... Anda mengerti maksudnya.

Selain itu, Anda menyimpan 2 baris kode yang sebagian besar dihasilkan secara otomatis tetapi Anda merampok semua bantuan sederhana di VSCode / IntelliJ seperti "Bungkus widget dengan padding". Jauh lebih sulit untuk membungkus ekstensi FormBuilderdengan padding pada semua penggunaan di aplikasi Anda. Jika Anda membuatnya sederhana, cukup bungkus di dalamnya Foo. Hal yang sama berlaku untuk semua widget lain yang Anda gunakan untuk tema, warna, gaya font, dll. - padding hanyalah sebuah contoh.

2 jitsm555 Aug 20 2020 at 21:16

Flutter lebih dari compositiondaripada Inheritance. Tapi Inheritance menggunakan StatelessWidget akan selalu berguna saat widget induk perlu digunakan kembali pada anak.

Misalnya:

class FormBuilder extends StatelessWidget {
  Widget getWidget() {
    return Text('Child Text');
  }

  @override
  Widget build(BuildContext context) {
    return Text('FormBuilder Text');
  }
}

class Foo extends FormBuilder {
  Foo() : super();

  @override
  Widget build(BuildContext context) {
    return getWidget();
  }
}

Jadi, Widget yang akan memanggil Foo () Widget yang akan menjadi pohon Elemen Widget

- Foo

- Wadah

Jika Komposisi normal maka pohon Elemen akan menjadi untuk ini

class Foo extends StatelessWidget {
      Foo() : super();
    
      @override
      Widget build(BuildContext context) {
        return FormBuilder();
      }
    }

- Foo

- FormBuilder

- SMS

Tidak ada dokumen resmi yang mengatakan pola buruknya tetapi flutter dirancang dengan Compositionmemperhatikan. Jadi, secara pribadi saya tidak pernah mengamati kinerja seperti itu atau masalah tertinggal dengan warisan, jadi saya sarankan Inheritancebukan pilihan yang buruk untuk menggunakannya.