Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (2)

Лучшие ответы пользователя

Все ответы (5)
  • Как работают Stateless и Stateful widget и generics в Dart?

    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);
    }
    Ответ написан
    Комментировать
  • Как добавить кнопку в Dart?

    MiT_73
    @MiT_73
    Вот пример того как создать кнопки в Flutter (А также документация, и базовые знания о виджетах):
    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyWidget());
    }
    
    //У этого виджета имеется состояние.
    class MyWidget extends StatefulWidget {
      @override
      createState() => new MyWidgetState();
    }
    
    class MyWidgetState extends State<MyWidget> {
      String text; // Наш текст для демонстрации функционала кнопки.
    
      @override
      initState() {
        super.initState();
        text = "test"; // Начальная инициализация кнопки.
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            body: Center(
              child: Column(
                children: [
                  Text(text), // Наш текст для демонстрации функционала кнопки.
    
                  // Flat кнопка.
                  FlatButton(
                    color: Colors.blue, // Цвет кнопки.
                    textColor: Colors.white, // Цвет текста кнопки.
                    child: Text("Flat Button"), // Текст кнопки.
    
                    // При нажатие меняем текст (Функционал кнопки).
                    onPressed: () => {
                      // При помощи установки нового состояния.
                      setState(() {
                        text = "Flat Button";
                      })
                    },
                  ),
    
                  // Raised кнопка.
                  RaisedButton(
                    child: Text('Raised Button'),
                    onPressed: () => {
                      setState(() {
                        text = "Raised Button";
                      })
                    },
                  ),
    
                  // Icon кнопка.
                  IconButton(
                    icon: Icon(Icons.android),
                    color: Colors.blue,
                    onPressed: () => {
                      setState(() {
                        text = "Icon Button";
                      })
                    },
                  ),
                ],
              ),
            ),
          ),
        );
      }
    }
    Ответ написан
    Комментировать