flutter_blocとは
flutter_bloc
は、FlutterアプリケーションでBLoC(Business Logic Component)デザインパターンを簡単に実装するためのパッケージです。これにより、ビジネスロジックとUIの分離が促進され、コードのテストと再利用性が向上します。このパッケージは、BLoCとCubitを統合し、状態管理を簡単に行うためのさまざまなウィジェットを提供します。
使い方
インストール
まず、pubspec.yaml
ファイルにflutter_bloc
の依存関係を追加します。
dependencies:
flutter:
sdk: flutter
flutter_bloc: ^8.1.5
基本的な使用例
以下は、flutter_bloc
を使用してカウンターアプリを作成する例です。
CounterCubitの作成
まず、カウンターのビジネスロジックを管理するCubitを作成します。
import 'package:bloc/bloc.dart';
class CounterCubit extends Cubit<int> {
CounterCubit() : super(0);
void increment() => emit(state + 1);
void decrement() => emit(state - 1);
}
main.dart
次に、BlocProvider
を使ってCounterCubit
を提供するCounterApp
ウィジェットを作成します。
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'counter_cubit.dart';
void main() => runApp(CounterApp());
class CounterApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: BlocProvider(
create: (_) => CounterCubit(),
child: CounterPage(),
),
);
}
}
CounterPageの作成
CounterPage
は、カウンターの値を表示し、インクリメントおよびデクリメントボタンを提供するウィジェットです。
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'counter_cubit.dart';
class CounterPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Counter')),
body: BlocBuilder<CounterCubit, int>(
builder: (context, count) => Center(child: Text('$count')),
),
floatingActionButton: Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
FloatingActionButton(
child: const Icon(Icons.add),
onPressed: () => context.read<CounterCubit>().increment(),
),
const SizedBox(height: 4),
FloatingActionButton(
child: const Icon(Icons.remove),
onPressed: () => context.read<CounterCubit>().decrement(),
),
],
),
);
}
}
ウィジェットの詳細
BlocBuilder
BlocBuilder
は、BLoCの状態に応じてウィジェットを構築するためのFlutterウィジェットです。これは、BLoCの状態が変化するたびにウィジェットを再構築するために使用されます。
BlocBuilder<CounterCubit, int>(
builder: (context, count) {
return Text('$count');
},
);
BlocListener
BlocListener
は、BLoCの状態変化に応じて一度だけ何らかのアクションを実行するためのFlutterウィジェットです。これは、ナビゲーションやダイアログ表示などの一度だけ行う操作に適しています。
BlocListener<CounterCubit, int>(
listener: (context, state) {
if (state == 5) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Count is 5')));
}
},
child: CounterPage(),
);
BlocProvider
BlocProvider
は、BLoCをウィジェットツリー内の子供に提供するための依存性注入(DI)ウィジェットです。これにより、BLoCの単一インスタンスをサブツリー内の複数のウィジェットに提供できます。
BlocProvider(
create: (context) => CounterCubit(),
child: CounterPage(),
);
MultiBlocProvider
MultiBlocProvider
は、複数のBlocProvider
を一つにまとめるためのウィジェットです。これにより、複数のBLoCを提供する際の可読性が向上し、ネストの必要がなくなります。
MultiBlocProvider(
providers: [
BlocProvider<CounterCubit>(create: (context) => CounterCubit()),
BlocProvider<AnotherCubit>(create: (context) => AnotherCubit()),
],
child: AppWidget(),
);
パラメータの詳細
BlocBuilder
bloc
: 監視するBLoCインスタンスを指定します。省略すると、BlocProvider
から自動的に取得されます。builder
: 状態変化に応じてウィジェットを構築する関数です。BlocListener
bloc
: 監視するBLoCインスタンスを指定します。省略すると、BlocProvider
から自動的に取得されます。listener
: 状態変化に応じて一度だけ実行される関数です。BlocProvider
create
: 提供するBLoCインスタンスを生成する関数です。lazy
: デフォルトでtrue
。false
にすると、即座にBLoCインスタンスが作成されます。