Мне нужно создать группу переключателей без использования виджета с отслеживанием состояния. Я хочу, чтобы шаблон BLoC во флаттере создавал группу переключателей. Как его создать?
Я только пытался использовать обычный виджет Радио, используя управление состоянием onChange.
Пожалуйста, попробуйте опубликовать код в будущем, чтобы мы могли помочь вам понять, что не так с самим кодом или подходом. Я не уверен, что это именно то, о чем вы просите, но вы можете создать виджет без сохранения состояния, который будет действовать как группа переключателей, используя библиотеку BLOC.
Допустим, у вас есть 2 варианта (для переключателей):
enum RadioButtonOption {
FirstOption,
SecondOption;
}
и, чтобы упростить ситуацию, мы создадим простейший Cubit, чтобы управлять состоянием группы переключателей:
class RadioCubit extends Cubit<RadioButtonOption> {
RadioCubit(RadioButtonOption initialOption) : super(initialOption);
void changeOption(RadioButtonOption newOption) {
emit(newOption);
}
}
Чтобы заставить его работать в виджете без сохранения состояния, вам нужно создать кубит и всякий раз, когда вызывается функция onChanged
, просто передавать результат в кубит. Использование BlocBuilder
автоматически обновит пользовательский интерфейс:
class MyHomePage extends StatelessWidget {
const MyHomePage({super.key});
void changeOption(RadioButtonOption? newValue, BuildContext context) {
if (newValue != null) {
context.read<RadioCubit>().changeOption(newValue);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: BlocProvider(
create: (_) => RadioCubit(RadioButtonOption.FirstOption),
child: BlocBuilder<RadioCubit, RadioButtonOption>(
builder: (context, state) {
return Column(
children: [
Radio(
value: RadioButtonOption.FirstOption,
groupValue: state,
onChanged: (newValue) {
changeOption(newValue, context);
},
),
Radio(
value: RadioButtonOption.SecondOption,
groupValue: state,
onChanged: (newValue) {
changeOption(newValue, context);
},
),
],
);
},
),
),
);
}
}
Я надеюсь, что это помогает.
Большое спасибо, это точный ответ, который я искал в своем приложении. Ценить это.