@ameame

Как работают Stateless и Stateful widget и generics в Dart?

Как работают Stateless и Stateful widget и generics в Dart?
Прочитала документацию, все равно не совсем понятно.
  • Вопрос задан
  • 3393 просмотра
Пригласить эксперта
Ответы на вопрос 1
MiT_73
@MiT_73
StatelessWidget – рекомендуется для неизменяемых виджетов. Это такие виджеты которые не имеют внутреннего состояния, зависят только от конфигурационных параметров и от родительских виджетов.
Вот некоторые виджеты которые наследуются от StatelessWidget:
  • Text()
  • FlatButton()
  • Container()
  • и др.

Самая простая конструкция для создания виджета от суперкласса StatelessWidget:
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Text('my text');
  }
}

StatelessWidget – нужен там где внутреннее состояние одно и оно сформировано параметрами и данными которые нам известны заранее.

StatefulWidget – рекомендуется для изменяемых виджетов, с изменяемым внутренним состоянием (State). Под изменяемым состоянием понимается изменение внутреннего состояния экземпляра класса в зависимости от какого-то события (по нажатию, времени и пр.) Для этого нужно создавать виджет котопый наследует StatefulWidget.
Вот некоторые виджеты, которые наследуются от StatefulWidget:
  • Image()
  • Form()
  • и др.

Самая простая конструкция для создания виджета от суперкласса StatefulWidget:
class MyWidget extends StatefulWidget {
  @override
  createState() => new MyWidgetState();
}

class MyWidgetState extends State<MyWidget> {

  @override
  initState() {
    super.initState();
    // ...
  }

  @override
  Widget build(BuildContext context) {
    return new Text('my text');
  }
}

StatefulWidget – нужен когда внутренних состояний больше одного и они могут сменять друг друга.

Создатели Flutter рекомендуют использовать StatelessWidget везде, где можно обойтись без StatefulWidget. Это связано с тем что перестроение StatefulWidget стоит намного дороже (в плане потребления ресурсов и отрисовки). Так же рекомендуется сводить к минимуму дочерних виджетов в StatefulWidget. Оказывается это было ложным утверждением, разницы никакой нет.

Generics или обобщения позволяют добавить программе гибкости и уйти от жесткой привязки к определенным типам. Иногда возникает необходимость, определить функционал таким образом, чтобы он мог использовать данные любых типов. Вот простой пример который поможет вам понять что такое Generics:
void main (){
    Person bob = Person("324", "Bob");
    print(bob.id.runtimeType);  // String
    Person sam = Person(123, "Sam");
    print(sam.id.runtimeType);  // int
}
 
// T это Generic, если его не было, 
//нам пришлось-бы использовать несколько классов для определения идентификатора пользователя, 
//но в данном случае он Generic и мы можем передавать в него любой тип данных.
class Person<T>{
    T id;   // идентификатор пользователя
    String name; // имя пользователя
    Person(this.id, this.name);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы