Flutter Angular风格状态管理插件angular_bloc的使用

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

Flutter Angular风格状态管理插件angular_bloc的使用

插件简介

angular_bloc 是一个Dart包,它帮助在 AngularDart 中实现BLoC模式,并与bloc 包配合工作。更多详情请访问 bloclibrary.dev

Angular Bloc Package

主要特性

  • BlocPipe: 一个Angular管道,用于将BLoC的状态变化绑定到视图层。
  • Cubit 和 Bloc 的使用:通过简单的例子展示如何使用Cubit和Bloc来管理应用状态。

安装与配置

pubspec.yaml 文件中添加依赖:

dependencies:
  angular: ^6.0.0
  angular_bloc: ^2.0.0

运行命令以获取依赖项:

flutter pub get

使用示例

Counter 应用案例

1. 创建 Cubit 或 Bloc

Cubit 实现 - counter_cubit.dart
import 'package:bloc/bloc.dart';

class CounterCubit extends Cubit<int> {
  CounterCubit() : super(0);

  void increment() => emit(state + 1);
  void decrement() => emit(state - 1);
}
Bloc 实现 - counter_bloc.dart
import 'package:bloc/bloc.dart';

abstract class CounterEvent {}

class CounterIncrementPressed extends CounterEvent {}

class CounterDecrementPressed extends CounterEvent {}

class CounterBloc extends Bloc<CounterEvent, int> {
  CounterBloc() : super(0) {
    on<CounterIncrementPressed>((event, emit) => emit(state + 1));
    on<CounterDecrementPressed>((event, emit) => emit(state - 1));
  }

  @override
  void onTransition(Transition<CounterEvent, int> transition) {
    super.onTransition(transition);
    print(transition);
  }
}

2. 创建组件

组件 Dart 文件 - counter_page_component.dart
import 'package:angular/angular.dart';
import 'package:angular_bloc/angular_bloc.dart';
import './counter_cubit.dart'; // 或者 counter_bloc.dart

@Component(
  selector: 'counter-page',
  templateUrl: 'counter_page_component.html',
  pipes: [BlocPipe],
)
class CounterPageComponent implements OnInit, OnDestroy {
  late final CounterCubit counterCubit; // 或者 CounterBloc counterBloc;

  @override
  void ngOnInit() {
    counterCubit = CounterCubit();
    // 如果是 Bloc,则为 counterBloc = CounterBloc();
  }

  @override
  void ngOnDestroy() {
    counterCubit.close();
    // 如果是 Bloc,则为 counterBloc.close();
  }

  void increment() => counterCubit.increment();
  // 如果是 Bloc,则为 counterBloc.add(CounterIncrementPressed());

  void decrement() => counterCubit.decrement();
  // 如果是 Bloc,则为 counterBloc.add(CounterDecrementPressed());
}
组件 HTML 文件 - counter_page_component.html
<div>
  <h1>Counter App</h1>
  <h2>Current Count: {{ $pipe.bloc(counterCubit) }}</h2>
  <!-- 如果是 Bloc,则为 {{ $pipe.bloc(counterBloc) }} -->
  <button (click)="increment()">+</button>
  <button (click)="decrement()">-</button>
</div>

完整示例代码

// example/example.dart

import 'package:angular_bloc/angular_bloc.dart';
import 'package:ngdart/angular.dart';

@Component(
  selector: 'my-app',
  template: '<counter-page></counter-page>',
  directives: [CounterPageComponent],
)
class AppComponent {}

abstract class CounterEvent {}

class CounterIncrementPressed extends CounterEvent {}

class CounterDecrementPressed extends CounterEvent {}

class CounterBloc extends Bloc<CounterEvent, int> {
  CounterBloc() : super(0) {
    on<CounterIncrementPressed>((event, emit) => emit(state + 1));
    on<CounterDecrementPressed>((event, emit) => emit(state - 1));
  }

  @override
  void onTransition(Transition<CounterEvent, int> transition) {
    super.onTransition(transition);
    print(transition);
  }
}

const String template =
    r'''<div><h1>Counter App</h1><h2>Current Count: {{ $pipe.bloc(counterBloc) }}</h2><button (click)="increment()">+</button><button (click)="decrement()">-</button></div>''';

@Component(
  selector: 'counter-page',
  pipes: [BlocPipe],
  template: template,
)
class CounterPageComponent implements OnInit, OnDestroy {
  late final CounterBloc counterBloc;

  @override
  void ngOnInit() {
    counterBloc = CounterBloc();
  }

  @override
  void ngOnDestroy() {
    counterBloc.close();
  }

  void increment() => counterBloc.add(CounterIncrementPressed());

  void decrement() => counterBloc.add(CounterDecrementPressed());
}

通过上述代码,您可以快速上手 angular_bloc 插件,并将其应用于自己的项目中。希望这个指南对您有所帮助!如果有任何问题或需要进一步的帮助,请随时联系我。


更多关于Flutter Angular风格状态管理插件angular_bloc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Angular风格状态管理插件angular_bloc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用angular_bloc(注意,实际上在Flutter生态系统中更常用的状态管理库是Bloc,而不是angular_bloc,因为angular_bloc主要用于Angular Dart,但假设你是指类似Bloc模式的状态管理)的示例。这里,我们将展示如何使用flutter_bloc库来实现类似Angular中的状态管理。

首先,确保你已经在pubspec.yaml文件中添加了flutter_blocbloc的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_bloc: ^x.y.z  # 请使用最新版本号
  bloc: ^x.y.z          # 请使用最新版本号

然后,运行flutter pub get来安装这些依赖。

接下来,我们将创建一个简单的计数器应用来演示状态管理。

1. 定义状态(States)和事件(Events)

首先,我们定义计数器的状态和事件。

// counter_event.dart
import 'package:equatable/equatable.dart';

abstract class CounterEvent extends Equatable {
  const CounterEvent();

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

class IncrementEvent extends CounterEvent {}

class DecrementEvent extends CounterEvent {}
// counter_state.dart
import 'package:equatable/equatable.dart';

class CounterState extends Equatable {
  final int count;

  const CounterState(this.count);

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

2. 创建Bloc

接下来,我们创建一个Bloc来处理事件并生成新的状态。

// counter_bloc.dart
import 'package:bloc/bloc.dart';
import 'counter_event.dart';
import 'counter_state.dart';

class CounterBloc extends Bloc<CounterEvent, CounterState> {
  CounterBloc() : super(CounterState(0)) {
    on<IncrementEvent>((event, emit) => emit(state.copyWith(count: state.count + 1)));
    on<DecrementEvent>((event, emit) => emit(state.copyWith(count: state.count - 1)));
  }
}

3. UI 层

现在,我们在UI层使用Bloc来管理状态。

// main.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'counter_bloc.dart';
import 'counter_event.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: CounterPage(),
      ),
    );
  }
}

class CounterPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Flutter Bloc Counter')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            BlocBuilder<CounterBloc, CounterState>(
              builder: (context, state) {
                return Text('${state.count}', style: TextStyle(fontSize: 24));
              },
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => context.read<CounterBloc>().add(IncrementEvent()),
              child: Text('Increment'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: () => context.read<CounterBloc>().add(DecrementEvent()),
              child: Text('Decrement'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的计数器应用,使用Bloc模式来管理状态。CounterBloc处理IncrementEventDecrementEvent事件,并生成新的CounterState。UI层使用BlocProvider提供Bloc实例,并使用BlocBuilder监听状态变化。

这样,你就实现了一个类似Angular风格的状态管理在Flutter中的应用。希望这对你有所帮助!

回到顶部