Blocを使いながらiOSからヘルスケア情報を取得してみた
カテゴリー:Flutter投稿日:2023-10-17
久しぶりの投稿です...
前の記事の続きみたいな感じです。
こんな感じになりました。前回に比べてBlocを触る機会が増えたのですが、実装した感じとしてすごく楽しかった(小並感)です。
必要なのは`Bloc`, `Event`, `State`の3つ
class HealthBloc extends Bloc<HealthEvent, HealthState> {
MyHealth health = MyHealth();
HealthBloc() : super(HealthLoading()){
on<HealthStart>(_onStart);
on<FilterAndFetchData>(_onFilterAndFetchData);
on<OrderAndFetchData>(_onOrderAndFetchData);
}
void _onStart(HealthStart event, Emitter<HealthState> emit) async {
bool authorized = await health.authorize();
if (authorized) {
await health.fetchHealthData(null, null);
emit(HealthState(healthData: health));
} else {
emit(HealthError("認証に失敗しました"));
}
}
}
abstract class HealthEvent {}
class HealthStart extends HealthEvent {}
class HealthState{
final MyHealth? healthData;
HealthState({this.healthData});
}
class HealthError extends HealthState{
final String message;
HealthError(this.message);
}
class HealthPage extends StatelessWidget{
const HealthPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => HealthBloc()..add(HealthStart()),
child:BlocBuilder<HealthBloc,HealthState>(
builder: (context,state){
if( state is HealthLoading){
return const Scaffold(
body: Center(
child:CircularProgressIndicator()
)
);
}else if(state is HealthError){
return Scaffold(
body: Center(
child: Text(state.message),
),
);
}else{
return Scaffold(
body: Center(
{/** TODO Widgetを表示させる */}
UI(Widget)側からEventを発火。Bloc内でEventに対応した動きを実行。その結果得られるStateをUIに流すという動き。
最初は意味わかんなかったけどやっていくうちに楽しくなってくてた。
一番嬉しかったのはBlocProviderが使われているWidget内にある、子Widgetはcontextからblocにアクセスできること。
ReactのPropバケツリレーみたいなことするかWidgetそれぞれでProvider書かないといけないかと思ったけどそんなことしなくて済むのはスバラ。
Flutterは楽しいからもう少し勉強して使いこなしたい