Флаттер, вставка параметров в StatefulWidget

#flutter

#флаттер

Вопрос:

Может кто-нибудь сказать мне, что происходит в этой программе?

         body: new ListView.builder(
          itemBuilder: (BuildContext context, int index) {
            return new StuffInTiles(listOfTiles[index]);
          },
          itemCount: listOfTiles.length,
        ),
      ),
    );
  }
}

class StuffInTiles extends StatefulWidget{
  final MyTile myTile;

  const StuffInTiles(this.myTile);
  @override
  StuffInTilesState createState() => StuffInTilesState();
}

class StuffInTilesState extends State<StuffInTiles> {

  @override
  Widget build(BuildContext context) {
    return Container(child:
    //Text(widget.myTile.title),);
        _buildTiles(widget.myTile));
  }

  Widget _buildTiles(MyTile t) {
  

Я хочу понять, как работает передача параметров, почему у меня

 const StuffInTiles(this.myTile);
  

что делает этот код в этой программе?

в моем class StuffInTilesState extends State<StuffInTiles> у меня нет никакого конструктора, так как же работает этот код? почему мои параметры просто оказались там? раньше я изучал C , так что для меня это похоже на волшебство

Комментарии:

1. Я думаю, вам следует прочитать эту статью , чтобы понять, что происходит в коде.

Ответ №1:

Если вы изучали C , вы, вероятно, знакомы со списком инициализаторов, который также есть в Dart. В C вы могли бы что-то сделать:

 MyClass {

 MyClass(MyTitle title) : this.myTitle = title;

 final MyTitle myTitle;
}
  

Который также действителен в Dart. Однако Dart позволяет сокращать вызов, автоматически присваивая ссылку на новое свойство класса, без использования какой-либо промежуточной переменной.

 MyClass(this.myTitle);
  

Это в основном то же самое, но гарантирует, что любое заданное свойство не будет null выполнено, если вы явно не передадите null .

В Dart доступны конструкторы другого типа, такие как частные конструкторы, фабричные конструкторы и именованные конструкторы. Возможно, вы захотите ознакомиться с официальной документацией, чтобы узнать об этом больше.

Ответ №2:

По умолчанию, когда вы создаете классы в Dart, реализован только default конструктор.

Например, если у вас есть класс с именем AwesomeWidget . У него будет конструктор по умолчанию AwesomeWidget() , который позволяет вам создавать экземпляр этого виджета.

Таким образом, вы могли бы использовать конструктор по умолчанию в коде следующим образом:

 //Example 1
return AwesomeWidget();

//Example 2
AwesomeWidget myWidget = AwesomeWidget();

//Example 3
//...
Row(
  children: [
    Text("Example Code!"),
    AwesomeWidget(),
    Text("Example Footer Code!"),
  ],
),
//...

  

Теперь, если вы хотите передать некоторые значения или некоторые данные в свои классы виджетов, вы используете код, который вы опубликовали выше в своем вопросе.

Вопрос в том, зачем нам отправлять данные в наши виджеты?Ответ: Самый большой вариант использования — это когда мы создаем элементы нашего списка в виде отдельных виджетов. Например, в моем приложении food я должен показывать историю заказов моего пользователя в a ListView , поэтому для пользовательского интерфейса каждого отдельного элемента списка я просто создам вызываемый повторно используемый виджет OrderHistoryListItem .

В этом OrderHistoryListItem случае вы хотите показать дату и время объекта. И идентификатор заказа, и сколько пользователь заплатил в этом заказе или любые другие детали, поэтому, чтобы отобразить это, мы отправляем эти данные в наш многоразовый элемент списка виджетов, который их отображает. Все просто.

И это одна из причин, по которой мы передаем значения виджетам. Как программист, вы можете использовать эту удобную функцию для более сложных сценариев, проявите творческий подход!