Есть ли способ перестроить виджет с помощью этого 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.

Другие вопросы по тегам