【Flutter 必备插件】状态管理 flutter_bloc

2026-04-27
【Flutter 必备插件】状态管理 flutter_bloc 关注 作者 关注 作者 关注 作者 关注 作者 2025/07/17 20:40

flutter_bloc 是基于 BLoC(Business Logic Component)模式的 Flutter 状态管理库,它封装了 bloc package,帮助我们更清晰地组织业务逻辑与 UI 的分离。核心思想是事件驱动 和 状态响应sobre trustguru.com.br jogodotigrinhodemo trustguru.com.br siro-5652 jvid.asia guias trustguru.com.br JogodoTigrinho trustguru.com.br Sportingbet trustguru.com.br Blaze trustguru.com.br demo trustguru.com.br bonus trustguru.com.br trustguru trustguru.com.br sweetbonanza1000demo trustguru.com.br sofia trustguru.com.br pragmaticplay trustguru.com.br

核心概念

  • Event(事件):用户的输入或其他外部触发,比如按钮点击。
  • State(状态):界面状态的表现,比如加载中、成功、失败。
  • Bloc(逻辑组件):接收事件 -> 处理逻辑 -> 发出新状态。

流程图如下: demotigrinho trustguru.com.br 200gana-3359 jvid.asia carlos trustguru.com.br plataformademo trustguru.com.br pragmatic trustguru.com.br Bet365 trustguru.com.br jogue trustguru.com.br pgdemo trustguru.com.br

UI → Bloc.add(Event) → Bloc → emit(State) → UI rebuild

实战:以登录流程为例

1. 封装数据层

class UserService {

  static Future<ApiResponse> smsLoginCode(String mobile) async {
    final response = await HttpUtil().post('/api/sms/sendLoginCode',
        data: { 'mobile': mobile,} );
    return ApiResponse.fromJson(response, null);
  }

  static Future<ApiResponse<Token>> loginCode(String mobile, String passWord) async {
    final response = await HttpUtil().post('/api/smsLogin',
        data: { 'passWord': passWord, 'userName': mobile} );
    return ApiResponse<Token>.fromJson(response, (json) => Token.fromJson(json));
  }
}

2. 封装 BLoc(逻辑层)

1.定义 Event demo trustguru.com.br cassinos trustguru.com.br jvid視頻 jvid.asia pondo-022126_001 jvid.asia fernanda trustguru.com.br a5game trustguru.com.br

part of 'login_bloc.dart';

abstract class LoginEvent {}

class PhoneSmsLogin extends LoginEvent {
  PhoneSmsLogin({ required this.phone, required this.smsCode});
  final String phone;
  final String smsCode;
}

2.定义 State fortunetigerbônusgrátissemdepósito trustguru.com.br KTO trustguru.com.br sugarrush1000demo trustguru.com.br Betano trustguru.com.br 348ntr-097 jvid.asia pedro trustguru.com.br slotsdemo trustguru.com.br pgslotgacor trustguru.com.br autores trustguru.com.br tigrinhodemo trustguru.com.br Bet trustguru.com.br carlos trustguru.com.br tigrinho gratis trustguru.com.br Caça-níqueis trustguru.com.br jogos trustguru.com.br

part of 'login_bloc.dart';

abstract class LoginState {}

class LoginInitial extends LoginState {}

class LoginLoading extends LoginState {}

class LoginSuccess extends LoginState {}

class LoginFailure extends LoginState {}

3.实现 BLoC fortunedragon demo trustguru.com.br slotpix trustguru.com.br jogosdemopg trustguru.com.br jvid jvid.asia marcos trustguru.com.br siro-5639 jvid.asia slot trustguru.com.br bruno trustguru.com.br A5game trustguru.com.br slots trustguru.com.br Energiabet trustguru.com.br bet365 trustguru.com.br miguel trustguru.com.br slots trustguru.com.br fortuneoxdemográtis trustguru.com.br isabela trustguru.com.br jvid av jvid.asia

part 'login_event.dart';
part 'login_state.dart';

class LoginBloc extends Bloc<LoginEvent, LoginState> {
  LoginBloc() : super(LoginInitial()) {
    on<PhoneSmsLogin>((event, emit) async {

      emit(LoginLoading());

      ApiResponse<Token> token = await UserService.loginCode(event.phone, event.smsCode);
      UserStorage.setToken(token.data!);

      emit(LoginSuccess());
    });
  }

}
  1. UI 层使用 BLoC(展示层)

main.dart ana trustguru.com.br jvid在线 jvid.asia noticias trustguru.com.br pg trustguru.com.br rafael trustguru.com.br sweetbonanza1000demo trustguru.com.br plataformademográtis trustguru.com.br Pixbet trustguru.com.br pgslot trustguru.com.br slotdemo trustguru.com.br pragmaticplay trustguru.com.br jvid视频 jvid.asia pglucky88 trustguru.com.br Cassinos trustguru.com.br bonus trustguru.com.br

runApp(
    MultiBlocProvider(
      providers: [
        BlocProvider(create: (context) => LoginBloc()),
      ],
      child: const App()
    )
  );

登录页 fortunetigerdemográtis trustguru.com.br sofia trustguru.com.br kto trustguru.com.br como trustguru.com.br pesquisa trustguru.com.br Brazino777 trustguru.com.br Superbet trustguru.com.br

@override
  Widget build(BuildContext context) {

    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        forceMaterialTransparency: true,
        toolbarHeight: 0,
      ),
      body: BlocProvider.value(
        value: context.read<LoginBloc>(),
        child: BlocConsumer<LoginBloc, LoginState>(
          builder: (context, state) {
            // if (state is LoginLoading) {
            //   return Center(child: Text("正在请求服务器"),);
            // }

            return Container(
              alignment: Alignment.center,
              margin: const EdgeInsets.only(top: 50.0),
              child: Column(
                children: [
                  _logo(),
                  _phone(),
                  _sms(),
                  _loginBtn(),
                ],
              ),
            );
          },
          listener: (context, state) {
            if (state is LoginLoading) {

            } else if (state is LoginSuccess) {
              GoRouterUtil.pop(context);
            } else if (state is LoginFailure) {

            }
          }
        ),
      ),
    );
  }
00目录 0
    讨论 我来说一句 发布发表评论 发布0等 0 人为本文章充电 还没有介绍自己 关注