Вопрос или проблема
Новичок в flutter/кодировании
У меня есть список в слое экрана
`List device = [
[Icons.lightbulb,'Свет',false],
[Icons.lightbulb,'Свет',false],
[Icons.lightbulb,'Свет',false],
[Icons.lightbulb,'Свет',false],
];`
и у меня есть GridView.builder, который использует список
`Expanded(
child: GridView.builder(
itemCount: 4,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
childAspectRatio: 1/1.5,
crossAxisCount: 2),
itemBuilder: (context, index) => Components(
icon: device[index][0],
second: device[index][1],
value: device[index][2],
onChanged: (value) {
setState(() {
device[index][2] = !device[index][2];
});
},
),
),
)`
Я попытался создать модель и передать ее на экран
Я пытаюсь разделить данные от экрана, есть ли советы и мысли о разделении ответственности. Я могу создать приложение, но в виде спагетти-кода
Ответ или решение
Разделение логики и представления является ключевым аспектом разработки программного обеспечения, особенно в контексте использования таких фреймворков, как Flutter. Чтобы сделать ваш код более читабельным и поддерживаемым, важно понимать, как достичь этой цели в рамках вашего текущего проекта.
1. Определение модели данных
Первым шагом к эффективному разделению логики и представления является создание четкой структуры данных. Вместо использования списка, можно создать модель, представляющую каждое устройство. Ваша модель может выглядеть следующим образом:
class Device {
final IconData icon;
final String name;
bool isActive;
Device({required this.icon, required this.name, this.isActive = false});
}
Такое оформление позволяет вам чётко определять, какие свойства имеет устройство и упрощает управление состоянием.
2. Замена списка моделей
Теперь вам нужно заменить ваш текущий список device
на список объектов Device
:
List<Device> devices = [
Device(icon: Icons.lightbulb, name: 'Light'),
Device(icon: Icons.lightbulb, name: 'Light'),
Device(icon: Icons.lightbulb, name: 'Light'),
Device(icon: Icons.lightbulb, name: 'Light'),
];
3. Обновление GridView
Ваша реализация GridView.builder
должна быть изменена для работы с новыми объектами модели:
Expanded(
child: GridView.builder(
itemCount: devices.length,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
childAspectRatio: 1/1.5,
crossAxisCount: 2,
),
itemBuilder: (context, index) => Components(
icon: devices[index].icon,
second: devices[index].name,
value: devices[index].isActive,
onChanged: (value) {
setState(() {
devices[index].isActive = value;
});
},
),
),
)
4. Используйте Reactivity
Избегайте использования локального состояния (например, переменная device
, такие как в вашем коде). Вместо этого рассмотрите возможность использования ChangeNotifier
для создания модели, которая уведомляет слушателей при изменении данных.
class DeviceModel extends ChangeNotifier {
final List<Device> _devices;
DeviceModel(this._devices);
List<Device> get devices => _devices;
void toggleDevice(int index) {
_devices[index].isActive = !_devices[index].isActive;
notifyListeners();
}
}
5. Применение Provider или других методов управления состоянием
Чтобы интегрировать ваш новый класс DeviceModel
, можно использовать пакет provider
, обеспечивая удобный доступ к данным между виджетами.
ChangeNotifierProvider(
create: (context) => DeviceModel(devices),
child: YourWidgetTree(),
);
В Components
, вы можете получить доступ к состоянию с помощью Provider
:
onChanged: (value) {
Provider.of<DeviceModel>(context, listen: false).toggleDevice(index);
}
Заключение
Эти шаги помогут вам реализовать лучшую разделяемость между логикой и представлением в вашем приложении на Flutter. Стремясь к чистому архитектурному подходу, вы не только улучшите читабельность своего кода, но и создадите основу для дальнейшей масштабируемости и поддержки. Помните: хорошо структурированный код — это залог вашего успеха в разработке программного обеспечения.