Flutter, как условно отобразить значок, если логическое значение пользователя и продукта совпадает в магазине Firestore? ⇐ Android
-
Anonymous
Flutter, как условно отобразить значок, если логическое значение пользователя и продукта совпадает в магазине Firestore?
У меня есть функция, с помощью которой пользователи могут устанавливать свои диетические предпочтения, и, скажем, они веганы, так что это будет означать, что их свойству IsVegan присвоено значение true, и если оно соответствует продукту, у которого для свойства IsVegan установлено значение true, он будет отображать значок зеленой галочки, в противном случае — красный значок крестика. В настоящее время у меня есть эта настройка, где я вызываю экземпляр ProductModel и UserModel. Есть ли «более интуитивный способ» сделать это без вызова UserModel, поскольку это потребует большого количества изменений в моем коде? Я вообще правильно подхожу к этому? И да, я новичок!
product_card_vertical.dart
класс NProductCardVertical расширяет StatelessWidget { const NProductCardVertical( {super.key, требуется этот.продукт, требуется этот.пользователь}); конечный продукт ProductModel; конечный пользователь UserModel; @переопределить Сборка виджета (контекст BuildContext) { // игнорировать: unused_local_variable конечный контроллер = ProductController.instance; окончательная темнота = NHelperFunctions.isDarkMode(контекст); // ... остальная часть кода // значок предпочтения Позиционируется( внизу: 0, слева: 0, ребенок: product.preferences?['Диета']['Веган'] && user.preferences?['Диета']['Веган'] ? НЦиркулярИкон( значок: Icons.check_circle, цвет: NColors.primary, рост: 33, ширина: 30, размер: 23, ) : НЦиркулярИкон( значок: Icons.cancel, цвет: NColors.красный, рост: 33, ширина: 30, размер: 23, ), ), // ... остальная часть кода product_model.dart
класс ProductModel { Идентификатор строки; Строковое имя; Артикул струн; НутриИнфоМодель? нутриИнфо; Струнный ингредиент; Струнный аллерген; Миниатюра строки; чувак? являетсяРекомендуемым; чувак? халяль; Карта? предпочтения; МодельПродукта({ требуется this.id, требуется это.имя, требуется этот.sku, это.nutriInfo, требуется этот.ингредиент, требуется этот.аллерген, требуется это.миниатюра, это.isFeatured, это.Халяль, это.предпочтения, }); // создаем пустую функцию для чистого кода статическая ProductModel пустая() => ProductModel( id: '', название: '', артикул: '', ингредиент: '', миниатюра: '', аллерген: ''); // формат JSON toJson() { возвращаться { 'Артикул': артикул, «Имя»: имя, «Ингредиенты»: ингредиент, «Аллерген»: аллерген, 'NutritionalInformation': nutriInfo!.toJson(), «Миниатюра»: миниатюра, 'IsFeatured': isFeatured, «ИсХаляль»: Халяль, «Предпочтения»: { 'Аллергия': {'IsEgg': ложь, 'IsNut': ложь}, 'Диета': { «IsVegan»: ложь, «IsDairyFree»: ложь, }, }, }; } // сопоставляем снимок JSON-ориентированного документа из Firebase с моделью фабрика ProductModel.fromSnapshot( DocumentSnapshot document) { if (document.data() == null) return ProductModel.empty(); окончательные данные = document.data()!; вернуть модель продукта( идентификатор: document.id, артикул: данные['SKU'] ?? '', имя: данные['Имя'] ?? '', ингредиент: данные['Ингредиенты'] ?? '', аллерген: данные['Аллерген'] ?? '', nutriInfo: NutriInfoModel.fromJson(данные['NutritionalInformation']), миниатюра: данные['Миниатюра'] ?? '', isFeatured: данные['IsFeatured'] ?? ЛОЖЬ, isHalal: данные['IsHalal'] ?? истинный, ); } // сопоставляем снимок JSON-ориентированного документа из Firebase с моделью фабрика ProductModel.fromQuerySnapshot( Документ QueryDocumentSnapshot) { окончательные данные = document.data() как Map; вернуть модель продукта( идентификатор: document.id, артикул: данные['SKU'] ?? '', имя: данные['Имя'] ?? '', ингредиент: данные['Ингредиенты'] ?? '', аллерген: данные['Аллерген'] ?? '', nutriInfo: NutriInfoModel.fromJson(данные['NutritionalInformation']), миниатюра: данные['Миниатюра'] ?? '', isFeatured: данные['IsFeatured'] ?? ЛОЖЬ, isHalal: данные['IsHalal'] ?? истинный, ); } } user_model.dart
класс UserModel { окончательный идентификатор строки; Строковое имя; Строка фамилия; Строковое имя пользователя; последняя строка электронного письма; Строка номер телефона; Струнный секс; Строка dateOfBirth; Строка профиляPicture; Настройки Map; окончательная дата создания метки времени; // конструктор для UserModel ПользовательскаяМодель({ требуется this.id, требуется this.firstName, требуется this.lastName, требуется это.имя пользователя, требуется этот адрес электронной почты, требуется this.phoneNumber, требуется this.sex, требуется this.dateOfBirth, требуется this.profilePicture, требуется this.preferences, требуется this.dateCreated, }); // вспомогательная функция для получения полного имени String get fullName => '$firstName $lastName'; Строка get formattedBirth => '$firstName $lastName'; // вспомогательная функция для форматирования номера телефона Строка форматируетсяPhoneNo => NFormatter.formatPhoneNumber(phoneNumber); // статическая функция для разделения полного имени статический List nameParts(fullName) => fullName.split(" "); // вспомогательная функция для получения имени пользователя статическая строкаgenerateUsername(fullName) { List nameParts = fullName.split(" "); Строка firstName = nameParts[0].toLowerCase(); Строка LastName = nameParts.length > 1? nameParts[1].toLowerCase() : ""; String CamelCaseUsername = "$firstName$lastName"; String usernameWithPrefix = "NS_$camelCaseUsername"; вернуть имя пользователяWithPrefix; } // статическая функция для создания пустой модели пользователя статическая UserModel пустая() => UserModel( идентификатор: '', имя: '', фамилия: '', имя пользователя: '', электронная почта: '', номер телефона: '', пол: '', Дата рождения: '', изображение профиля: '', предпочтения: { 'Аллергия': {'IsEgg': ложь, 'IsNut': ложь}, 'Диета': {'IsVegan': false, 'IsDairyFree': false}, }, dateCreated: Timestamp.now(), ); // конвертируем модель в структуру JSON Карта toJson() { возвращаться { «Имя»: имя, «Фамилия»: фамилия, «Имя пользователя»: имя пользователя, «Электронная почта»: электронная почта, 'НомерТелефона': НомерТелефона, «Секс»: секс, «ДатаРождения»: датаРождения, «Предпочтения»: { 'Аллергия': {'IsEgg': ложь, 'IsNut': ложь}, 'Диета': { «IsVegan»: ложь, «IsDairyFree»: ложь, }, }, 'ProfilePicture': ProfilePicture, 'DateCreated': датаCreated, }; } // фабричный метод для создания UserModel из снимка документа Firebase фабрика UserModel.fromSnapshot( DocumentSnapshot document) { если (document.data() != ноль) { окончательные данные = document.data()!; вернуть модель пользователя( идентификатор: document.id, firstName: данные['FirstName'] ?? '', фамилия: данные['Фамилия'] ?? '', имя пользователя: данные['Имя пользователя'] ?? '', электронная почта: данные['Электронная почта'] ?? '', номер телефона: данные ['PhoneNumber'] ?? '', секс: данные['Секс'] ?? '', dateOfBirth: данные['DateOfBirth'] ?? '', ProfilePicture: данные ['ProfilePicture'] ?? '', предпочтения: { 'Аллергия': данные['Аллергия'] ?? { 'IsEgg': ложь, 'IsNut': ложь, }, 'Диета': данные['Диета'] ?? { «IsVegan»: ложь, «IsDairyFree»: ложь, }, }, dateCreated: данные['DateCreated'] ?? Временная метка.сейчас(), ); } еще { вернуть UserModel.empty(); } } }
У меня есть функция, с помощью которой пользователи могут устанавливать свои диетические предпочтения, и, скажем, они веганы, так что это будет означать, что их свойству IsVegan присвоено значение true, и если оно соответствует продукту, у которого для свойства IsVegan установлено значение true, он будет отображать значок зеленой галочки, в противном случае — красный значок крестика. В настоящее время у меня есть эта настройка, где я вызываю экземпляр ProductModel и UserModel. Есть ли «более интуитивный способ» сделать это без вызова UserModel, поскольку это потребует большого количества изменений в моем коде? Я вообще правильно подхожу к этому? И да, я новичок!
product_card_vertical.dart
класс NProductCardVertical расширяет StatelessWidget { const NProductCardVertical( {super.key, требуется этот.продукт, требуется этот.пользователь}); конечный продукт ProductModel; конечный пользователь UserModel; @переопределить Сборка виджета (контекст BuildContext) { // игнорировать: unused_local_variable конечный контроллер = ProductController.instance; окончательная темнота = NHelperFunctions.isDarkMode(контекст); // ... остальная часть кода // значок предпочтения Позиционируется( внизу: 0, слева: 0, ребенок: product.preferences?['Диета']['Веган'] && user.preferences?['Диета']['Веган'] ? НЦиркулярИкон( значок: Icons.check_circle, цвет: NColors.primary, рост: 33, ширина: 30, размер: 23, ) : НЦиркулярИкон( значок: Icons.cancel, цвет: NColors.красный, рост: 33, ширина: 30, размер: 23, ), ), // ... остальная часть кода product_model.dart
класс ProductModel { Идентификатор строки; Строковое имя; Артикул струн; НутриИнфоМодель? нутриИнфо; Струнный ингредиент; Струнный аллерген; Миниатюра строки; чувак? являетсяРекомендуемым; чувак? халяль; Карта? предпочтения; МодельПродукта({ требуется this.id, требуется это.имя, требуется этот.sku, это.nutriInfo, требуется этот.ингредиент, требуется этот.аллерген, требуется это.миниатюра, это.isFeatured, это.Халяль, это.предпочтения, }); // создаем пустую функцию для чистого кода статическая ProductModel пустая() => ProductModel( id: '', название: '', артикул: '', ингредиент: '', миниатюра: '', аллерген: ''); // формат JSON toJson() { возвращаться { 'Артикул': артикул, «Имя»: имя, «Ингредиенты»: ингредиент, «Аллерген»: аллерген, 'NutritionalInformation': nutriInfo!.toJson(), «Миниатюра»: миниатюра, 'IsFeatured': isFeatured, «ИсХаляль»: Халяль, «Предпочтения»: { 'Аллергия': {'IsEgg': ложь, 'IsNut': ложь}, 'Диета': { «IsVegan»: ложь, «IsDairyFree»: ложь, }, }, }; } // сопоставляем снимок JSON-ориентированного документа из Firebase с моделью фабрика ProductModel.fromSnapshot( DocumentSnapshot document) { if (document.data() == null) return ProductModel.empty(); окончательные данные = document.data()!; вернуть модель продукта( идентификатор: document.id, артикул: данные['SKU'] ?? '', имя: данные['Имя'] ?? '', ингредиент: данные['Ингредиенты'] ?? '', аллерген: данные['Аллерген'] ?? '', nutriInfo: NutriInfoModel.fromJson(данные['NutritionalInformation']), миниатюра: данные['Миниатюра'] ?? '', isFeatured: данные['IsFeatured'] ?? ЛОЖЬ, isHalal: данные['IsHalal'] ?? истинный, ); } // сопоставляем снимок JSON-ориентированного документа из Firebase с моделью фабрика ProductModel.fromQuerySnapshot( Документ QueryDocumentSnapshot) { окончательные данные = document.data() как Map; вернуть модель продукта( идентификатор: document.id, артикул: данные['SKU'] ?? '', имя: данные['Имя'] ?? '', ингредиент: данные['Ингредиенты'] ?? '', аллерген: данные['Аллерген'] ?? '', nutriInfo: NutriInfoModel.fromJson(данные['NutritionalInformation']), миниатюра: данные['Миниатюра'] ?? '', isFeatured: данные['IsFeatured'] ?? ЛОЖЬ, isHalal: данные['IsHalal'] ?? истинный, ); } } user_model.dart
класс UserModel { окончательный идентификатор строки; Строковое имя; Строка фамилия; Строковое имя пользователя; последняя строка электронного письма; Строка номер телефона; Струнный секс; Строка dateOfBirth; Строка профиляPicture; Настройки Map; окончательная дата создания метки времени; // конструктор для UserModel ПользовательскаяМодель({ требуется this.id, требуется this.firstName, требуется this.lastName, требуется это.имя пользователя, требуется этот адрес электронной почты, требуется this.phoneNumber, требуется this.sex, требуется this.dateOfBirth, требуется this.profilePicture, требуется this.preferences, требуется this.dateCreated, }); // вспомогательная функция для получения полного имени String get fullName => '$firstName $lastName'; Строка get formattedBirth => '$firstName $lastName'; // вспомогательная функция для форматирования номера телефона Строка форматируетсяPhoneNo => NFormatter.formatPhoneNumber(phoneNumber); // статическая функция для разделения полного имени статический List nameParts(fullName) => fullName.split(" "); // вспомогательная функция для получения имени пользователя статическая строкаgenerateUsername(fullName) { List nameParts = fullName.split(" "); Строка firstName = nameParts[0].toLowerCase(); Строка LastName = nameParts.length > 1? nameParts[1].toLowerCase() : ""; String CamelCaseUsername = "$firstName$lastName"; String usernameWithPrefix = "NS_$camelCaseUsername"; вернуть имя пользователяWithPrefix; } // статическая функция для создания пустой модели пользователя статическая UserModel пустая() => UserModel( идентификатор: '', имя: '', фамилия: '', имя пользователя: '', электронная почта: '', номер телефона: '', пол: '', Дата рождения: '', изображение профиля: '', предпочтения: { 'Аллергия': {'IsEgg': ложь, 'IsNut': ложь}, 'Диета': {'IsVegan': false, 'IsDairyFree': false}, }, dateCreated: Timestamp.now(), ); // конвертируем модель в структуру JSON Карта toJson() { возвращаться { «Имя»: имя, «Фамилия»: фамилия, «Имя пользователя»: имя пользователя, «Электронная почта»: электронная почта, 'НомерТелефона': НомерТелефона, «Секс»: секс, «ДатаРождения»: датаРождения, «Предпочтения»: { 'Аллергия': {'IsEgg': ложь, 'IsNut': ложь}, 'Диета': { «IsVegan»: ложь, «IsDairyFree»: ложь, }, }, 'ProfilePicture': ProfilePicture, 'DateCreated': датаCreated, }; } // фабричный метод для создания UserModel из снимка документа Firebase фабрика UserModel.fromSnapshot( DocumentSnapshot document) { если (document.data() != ноль) { окончательные данные = document.data()!; вернуть модель пользователя( идентификатор: document.id, firstName: данные['FirstName'] ?? '', фамилия: данные['Фамилия'] ?? '', имя пользователя: данные['Имя пользователя'] ?? '', электронная почта: данные['Электронная почта'] ?? '', номер телефона: данные ['PhoneNumber'] ?? '', секс: данные['Секс'] ?? '', dateOfBirth: данные['DateOfBirth'] ?? '', ProfilePicture: данные ['ProfilePicture'] ?? '', предпочтения: { 'Аллергия': данные['Аллергия'] ?? { 'IsEgg': ложь, 'IsNut': ложь, }, 'Диета': данные['Диета'] ?? { «IsVegan»: ложь, «IsDairyFree»: ложь, }, }, dateCreated: данные['DateCreated'] ?? Временная метка.сейчас(), ); } еще { вернуть UserModel.empty(); } } }
Мобильная версия