You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何用BLoC模式实现无状态组件单选按钮组

用Flutter BLoC模式实现无StatefulWidget的单选按钮

1. 添加依赖

在pubspec.yaml中引入bloc和flutter_bloc包:

dependencies:
  flutter:
    sdk: flutter
  bloc: ^8.1.3
  flutter_bloc: ^8.1.4

版本号可根据Flutter生态更新情况替换为最新稳定版

2. 定义事件类

创建用于通知Bloc用户选择行为的事件:

class SelectOptionEvent extends Equatable {
  final String selectedValue;

  const SelectOptionEvent(this.selectedValue);

  @override
  List<Object> get props => [selectedValue];
}

继承Equatable是为了让Bloc能正确判断事件是否重复,避免无效状态更新

3. 定义状态类

创建保存单选按钮选中状态的模型,用于向UI传递状态数据:

class OptionSelectedState extends Equatable {
  final String selectedValue;

  const OptionSelectedState(this.selectedValue);

  @override
  List<Object> get props => [selectedValue];
}

4. 实现Bloc核心逻辑

编写处理事件、管理状态的Bloc类:

class OptionBloc extends Bloc<SelectOptionEvent, OptionSelectedState> {
  OptionBloc() : super(const OptionSelectedState('option1')) { // 设置初始选中值
    on<SelectOptionEvent>((event, emit) {
      // 收到选择事件后,发出新的选中状态
      emit(OptionSelectedState(event.selectedValue));
    });
  }
}

5. 构建无状态UI组件

通过BlocProvider提供Bloc实例,用BlocBuilder监听状态变化并渲染Radio组:

class RadioGroupWithBloc extends StatelessWidget {
  const RadioGroupWithBloc({super.key});

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => OptionBloc(),
      child: Scaffold(
        appBar: AppBar(title: const Text('BLoC 单选按钮')),
        body: BlocBuilder<OptionBloc, OptionSelectedState>(
          builder: (context, state) {
            return Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                ListTile(
                  title: const Text('选项1'),
                  leading: Radio<String>(
                    value: 'option1',
                    groupValue: state.selectedValue,
                    onChanged: (value) {
                      if (value != null) {
                        context.read<OptionBloc>().add(SelectOptionEvent(value));
                      }
                    },
                  ),
                ),
                ListTile(
                  title: const Text('选项2'),
                  leading: Radio<String>(
                    value: 'option2',
                    groupValue: state.selectedValue,
                    onChanged: (value) {
                      if (value != null) {
                        context.read<OptionBloc>().add(SelectOptionEvent(value));
                      }
                    },
                  ),
                ),
                ListTile(
                  title: const Text('选项3'),
                  leading: Radio<String>(
                    value: 'option3',
                    groupValue: state.selectedValue,
                    onChanged: (value) {
                      if (value != null) {
                        context.read<OptionBloc>().add(SelectOptionEvent(value));
                      }
                    },
                  ),
                ),
                const SizedBox(height: 20),
                Text('当前选中: ${state.selectedValue}'),
              ],
            );
          },
        ),
      ),
    );
  }
}

关键说明

  • 全程使用StatelessWidget,状态完全由Bloc接管,无需调用setState
  • BlocBuilder会自动监听Bloc的状态变化,实时更新Radio的选中状态
  • 通过context.read<OptionBloc>().add()触发事件,让Bloc处理状态更新逻辑

内容的提问来源于stack exchange,提问作者Neeta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:42:05