Можно Ли Перестроить HookConsumerWidget, Когда Изменяется Только Поле Наблюдаемого Объекта?

#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,  )  ),  ),  )  )  )  ],  ),  );  } }  

Заранее спасибо!