#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
случае вы хотите показать дату и время объекта. И идентификатор заказа, и сколько пользователь заплатил в этом заказе или любые другие детали, поэтому, чтобы отобразить это, мы отправляем эти данные в наш многоразовый элемент списка виджетов, который их отображает. Все просто.
И это одна из причин, по которой мы передаем значения виджетам. Как программист, вы можете использовать эту удобную функцию для более сложных сценариев, проявите творческий подход!