Есть ли способ перестроить виджет с помощью этого StateNotifierProvider (Flutter с использованием riverpod)?
Итак, я использую этот stateNotifierProvider, чтобы отслеживать selectedItem в этом toggleButton, однако, даже если состояние уведомителя фактически изменено, оно не запускает функцию сборки, как следует... Может ли кто-нибудь помочь мне с Вот этот?
Спасибо!
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../global/theme/theme_data.dart';
final sexProvider =
StateNotifierProvider<SexNotifier, List<bool>>((ref) => SexNotifier());
class SexNotifier extends StateNotifier<List<bool>> {
SexNotifier() : super([false, false, false]);
void updateSex(int index) {
List<bool> newState = state;
for (int i = 0; i < newState.length; i++) {
if (i == index) {
newState[i] = true;
} else {
newState[i] = false;
}
}
state = newState;
}
}
class SexPicker extends ConsumerWidget {
const SexPicker({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
final List<bool> selectedIcon = ref.watch(sexProvider);
return ToggleButtons(
selectedColor: Theme.of(context).primaryColor,
fillColor: ThemeModeData.kRedAccentColor,
borderRadius: BorderRadius.circular(22),
isSelected: selectedIcon,
onPressed: (index) {
ref.read(sexProvider.notifier).updateSex(index);
},
children: const [
Icon(
Icons.man,
size: 60,
),
Icon(Icons.woman, size: 60),
Icon(Icons.transgender_outlined, size: 50),
]);
}
}
Я пробовал все, что мог, чтобы заставить его работать, но не нашел ответа.
1 ответ
ваш новый должен быть новым объектом, посколькуstate
должен быть неизменным. Вы должны создать новый экземпляр, если хотите изменить его.
вместоstate = newState;
, делатьstate = newState.toList();
который создаст новыйList
.