Flutter代码生成插件rx_bloc_generator的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter代码生成插件rx_bloc_generator的使用

概述

rx_bloc_generator 是一个用于 rx_bloc 的代码生成器,旨在使您的 BloC 代码零样板。通过创建自定义注解,该插件可以自动生成所有必要的样板代码,从而简化了 BloC 的开发过程。

CI codecov style license

如何帮助您

在编程中,样板代码是指需要在许多地方包含且几乎不需要更改的代码段。为了保持代码库的一致性,您可能需要遵循某些约定,这有时会导致样板代码的出现。显然,rx_bloc 也不例外。每次创建新的 BloC 时,您可能需要编写一些重复的代码以保持 BloC API 的一致性。而 rx_bloc_generator 插件通过生成所有必要的样板代码来解决这个问题,从而使 BloC 本身成为零样板代码。

可用注解

以下是 rx_bloc_generator 提供的主要注解:

示例:使用 rx_bloc_generator 创建一个计数器 BloC

1. 添加依赖项

首先,在 pubspec.yaml 文件中添加 rx_bloc_generatorbuild_runnerdev_dependencies 中:

dev_dependencies:
  rx_bloc_generator: ^latest_version
  build_runner: ^latest_version

2. 创建 BloC 类

接下来,创建一个计数器 BloC 类,并定义其事件和状态合同:

import 'package:rx_bloc/rx_bloc.dart';
import 'package:rxdart/rxdart.dart';

// 定义事件合同
abstract class CounterBlocEvents {
  /// 增加计数
  void increment();

  /// 减少计数
  void decrement();
}

// 定义状态合同
abstract class CounterBlocStates {
  /// 当前计数值
  Stream<int> get count;

  /// 加载状态
  Stream<bool> get isLoading;

  /// 错误信息
  Stream<String> get errors;
}

// 使用 [@RxBloc](/user/RxBloc) 注解的计数器 BloC 类
[@RxBloc](/user/RxBloc)()
class CounterBloc extends $CounterBloc {
  final ServerSimulator _server;

  CounterBloc(this._server);

  // 映射事件到计数状态
  @override
  Stream<int> _mapToCountState() => Rx.merge<Result<int>>([
        _$incrementEvent.flatMap((_) => _server.increment().asResultStream()),
        _$decrementEvent.flatMap((_) => _server.decrement().asResultStream()),
      ])
          .setResultStateHandler(this)
          .whereSuccess()
          .startWith(0);

  @override
  Stream<String> _mapToErrorsState() =>
      errorState.map((result) => result.toString());

  @override
  Stream<bool> _mapToIsLoadingState() => loadingState;
}

3. 模拟服务器

为了模拟服务器响应时间,创建一个简单的 ServerSimulator 类:

class ServerSimulator {
  int _counter = 0;

  Future<int> increment() async {
    await Future.delayed(const Duration(milliseconds: 100));
    return ++_counter;
  }

  Future<int> decrement() async {
    await Future.delayed(const Duration(milliseconds: 100));
    if (_counter <= 0) {
      throw Exception('最小值已达到!');
    }
    return --_counter;
  }
}

4. 运行代码生成器

从项目根目录运行以下命令以生成样板代码:

flutter packages pub run build_runner build

或者,如果您希望在文件更改时自动生成代码,请使用以下命令:

flutter packages pub run build_runner watch

5. 查看生成的代码

生成的代码将保存在 [file-name].g.dart 文件中。例如,counter_bloc.g.dart 文件将包含所有必要的样板代码。

abstract class CounterBlocType extends RxBlocTypeBase {
  CounterBlocEvents get events;
  CounterBlocStates get states;
}

abstract class $CounterBloc extends RxBlocBase
    implements CounterBlocEvents, CounterBlocStates, CounterBlocType {
  final _$decrementEvent = PublishSubject<void>();

  @override
  void decrement() => _$decrementEvent.add(null);

  final _$incrementEvent = PublishSubject<void>();

  @override
  void increment() => _$incrementEvent.add(null);

  Stream<int>? _countState;

  @override
  Stream<int> get count => _countState ??= _mapToCountState();

  Stream<int> _mapToCountState();

  Stream<bool>? _isLoadingState;

  @override
  Stream<bool> get isLoading => _isLoadingState ??= _mapToIsLoadingState();

  Stream<bool> _mapToIsLoadingState();

  Stream<String>? _errorsState;

  @override
  Stream<String> get errors => _errorsState ??= _mapToErrorsState();

  Stream<String> _mapToErrorsState();

  @override
  CounterBlocEvents get events => this;

  @override
  CounterBlocStates get states => this;

  @override
  void dispose() {
    _$incrementEvent.close();
    super.dispose();
  }
}

总结

通过使用 rx_bloc_generator,您可以大大减少编写样板代码的时间,专注于业务逻辑的实现。只需定义好事件和状态合同,并使用相应的注解,即可让插件自动生成所有必要的样板代码。希望这个示例能帮助您更好地理解和使用 rx_bloc_generator 插件。


更多关于Flutter代码生成插件rx_bloc_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter代码生成插件rx_bloc_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用rx_bloc_generator插件的示例代码案例。rx_bloc_generator是一个用于自动生成BLoC(Business Logic Component)相关代码的插件,它结合了RxDart库来处理响应式编程。

前提条件

  1. 确保你已经安装了Flutter和Dart环境。
  2. 确保你已经安装了build_runnerrx_bloc_generator插件。

安装依赖

首先,在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  rxdart: ^2.5.0  # 确保使用兼容版本的rxdart
  flutter_bloc: ^7.0.0  # 确保使用兼容版本的flutter_bloc

dev_dependencies:
  build_runner: ^2.0.0
  rx_bloc_generator: ^x.y.z  # 替换为最新版本号

然后运行以下命令来安装依赖:

flutter pub get

创建BLoC和State类

假设我们要创建一个简单的计数器BLoC,首先定义State和Event类。

// counter_state.dart
part 'counter_state.g.dart';

@rxState
abstract class CounterState with $CounterState {
  final int count;

  const CounterState(this.count);

  factory CounterState.initial() = _CounterStateInitial;
  factory CounterState.incremented() = _CounterStateIncremented;
}

生成代码

counter_state.dart文件所在目录运行以下命令来生成代码:

flutter pub run build_runner build --build-target=counter_state.dart

这将生成一个counter_state.g.dart文件,其中包含了实现细节。

创建BLoC类

接下来,创建BLoC类来处理事件并生成新的状态。

// counter_bloc.dart
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:rxdart/rxdart.dart';
import 'counter_event.dart';
import 'counter_state.dart';

part 'counter_bloc.g.dart';

@rxBloc
abstract class CounterBloc with $CounterBloc {
  CounterBloc() : super(CounterState.initial()) {
    on<CounterEventIncremented>(_onIncremented);
  }

  void _onIncremented(CounterEventIncremented event, Emitter<CounterState> emit) {
    emit(CounterState.incremented());
  }
}

同样,运行以下命令生成代码:

flutter pub run build_runner build --build-target=counter_bloc.dart

定义Event类

创建事件类来触发BLoC的状态更新。

// counter_event.dart
part 'counter_event.g.dart';

@rxEvent
abstract class CounterEvent with $CounterEvent {}

class CounterEventIncremented extends CounterEvent {}

生成代码:

flutter pub run build_runner build --build-target=counter_event.dart

使用BLoC

最后,在你的UI组件中使用生成的BLoC。

// main.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'counter_bloc.dart';
import 'counter_state.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BlocProvider(
        create: (context) => CounterBloc(),
        child: CounterScreen(),
      ),
    );
  }
}

class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Counter')),
      body: Center(
        child: BlocBuilder<CounterBloc, CounterState>(
          builder: (context, state) {
            return Text('Count: ${state.count}');
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => context.read<CounterBloc>().add(CounterEventIncremented()),
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

运行应用

现在,你可以运行你的Flutter应用:

flutter run

你应该会看到一个计数器应用,当你点击浮动按钮时,计数器会增加。

以上就是一个使用rx_bloc_generator插件创建和管理BLoC的完整示例。希望这能帮助你理解如何在Flutter项目中使用该插件。

回到顶部