#flutter #dart #flutter-provider #riverpod #flutter-hooks
#трепетать #дротик #флаттер-провайдер #риверпод #флаттер-крючки
Вопрос:
Поэтому я потратил, как мне кажется, целую вечность, пытаясь найти ответ на то, что я считал довольно простой проблемой, но мне не удается найти никакой информации о том, как это сделать:
У меня есть класс собак как таковой:
class UserDog extends UserAnimal{ Setlt;Stringgt; breeds = {}; UserDog(User? user) : super(user); Future SetBreeds({ Setlt;Stringgt;? breeds }) async{ if (IsSignedIn() amp;amp; breeds != this.breeds amp;amp; breeds != null) { Setlt;Stringgt; breedList = {}; for (var breed in breeds.where((b) =gt; b != "")){ breedList.add(breed); } await GetUserData().update({DatabaseConsts.BreedField: breedList.toList()}); this.breeds = breedList; } } }
Этот простой класс имеет одно поле, которое расширяет суперкласс множеством других полей, но я заинтересован в обновлении набора пород, когда пользователь добавляет или удаляет породу в дереве виджетов.
Так как я использую hooks riverpod, я смог заставить другие виджеты в моем приложении нормально перестраиваться, используя a StateNotifier
и a ref.watch()
внутри a HookConsumerWidget
.
Но моя проблема возникает, когда у меня есть объект, подобный UserDog
объекту, и при вызове метода изменяется только поле SetBreed()
, а поскольку уведомитель о состоянии будет перестраиваться только после изменения всей ссылки на объект, это, очевидно, ничего не делает.
Итак, есть ли способ, которым я могу HookConsumerWidget
перестроить, когда поле объекта внутри уведомителя изменяется вместо всего объекта? Для справки, вот код виджета в том виде, в каком он есть в настоящее время:
class BreedTag extends HookConsumerWidget{ String text; BreedTag(this.text); @override Widget build(BuildContext context, WidgetRef ref){ Listlt;Widgetgt; widgets = []; var user = ref.watch(userProfile.state).state if (text == ""){ widgets = const [ Icon(Icons.add), SizedBox(child: Text("Add A Breed", overflow: TextOverflow.clip)), ]; } else{ widgets = [ Expanded( child: Align( alignment: Alignment.center, child: Text( text, overflow: TextOverflow.clip, textAlign: TextAlign.center, ) ) ) ]; } return Flexible( flex: 20, child: Flex( direction: Axis.horizontal, children: [ Expanded( child: Container( height: UserPageUIConsts.DataRowHeight, decoration: BoxDecoration( borderRadius: BorderRadius.circular(UserPageUIConsts.DataRowHeight/2), color: Colors.amber ), child: ClipRRect( borderRadius: BorderRadius.circular(UserPageUIConsts.DataRowHeight/2), child: MaterialButton( // Remove this breed from the list if the tag is tapped onPressed: () =gt; user.SetBreeds(user.breeds.where((u) =gt; u != breed).toSet()), splashColor: Colors.blue, padding: const EdgeInsets.all(0), child: Padding( padding: const EdgeInsets.fromLTRB(20, 0, 20, 0), child: Row( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: widgets, ) ), ), ) ) ) ], ), ); } }
Заранее спасибо!