Я думаю, что вы действительно хотите что-то вроде этого, и я буду использовать код Flutter Dart вместо псевдокода:
class Vehicle extends StatelessWidget {
final int type;
final String name;
final Widget list, edit, settings;
const Vehicle({Key key, this.type, this.name, this.list, this.edit, this.settings}) : super(key: key);
@override
Widget build(BuildContext context) => Row(children: <Widget>[list, edit, settings]);
}
class Truck extends StatelessWidget {
const Truck({Key key}) : super(key: key);
@override
Widget build(BuildContext context) => Vehicle(
type: 1,
name: 'Truck',
list: Column(),
edit: const Icon(Icons.edit),
settings: Checkbox(),
);
}
class Car extends StatelessWidget {
const Car({Key key}) : super(key: key);
@override
Widget build(BuildContext context) => Vehicle(
type: 2,
name: 'Car',
list: Column(),
edit: const Icon(Icons.edit_location),
settings: ToggleButtons(...),
);
}
Как видите, вы можете иметь предопределенный класс Vehicle
, который определяет параметрыа также обрабатывает размещение всей информации, которую вы хотите динамически отображать для разных транспортных средств.
Теперь вы можете реализовать конкретное транспортное средство, создав еще один виджет, который возвращает Vehicle
в своем методе сборки.
Очевидно, что виджеты макетов, которые я выбрал Row
, Column
и т. Д., Предназначены только в качестве заполнителей, но на самом деле вы можете реализовать логику макета, используя этот подход.
Я бы сказал, что это более идиоматический подход для виджетов.
Что касается вашего примера: вам, вероятно, не следует хранить виджеты в List
при использовании ListView.builder
, новы можете динамически создавать экземпляры ваших виджетов в функции builder
. Это также лучше с точки зрения производительности, если вы можете использовать ListView.builder
. Если вы не можете динамически создавать свои элементы, вы можете просто использовать ListView
и хранить ваши виджеты в списке.
builder: () {
if (items[index]['type'] == 'car')
return Car(...);
return Truck(...);
}