Bloc6
BlocSelector¶
Reference¶
https://pub.dev/packages/flutter_bloc
BlocSelector 是類似於 BlocBuilder 的 Flutter 小工具,但允許開發人員根據目前的區塊狀態選擇新值來篩選更新。如果選取的值沒有變更,就會防止不必要的建構。選取的值必須是不可變的,才能讓 BlocSelector 準確判斷是否應該再次呼叫 builder 。
如果省略 bloc 參數, BlocSelector 將自動使用 BlocProvider 和當前 BuildContext 執行查詢。
一個小範例¶
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
// 定義計數器的狀態
class CounterState {
final int count;
CounterState(this.count);
}
// 定義計數器的Bloc
class CounterBloc extends Bloc<void, CounterState> {
CounterBloc() : super(CounterState(0)) {
on<IncrementEvent>((event, emit) {
emit(CounterState(state.count + 1));
});
}
}
// 自定義事件類
class IncrementEvent {}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: BlocProvider(
create: (context) => CounterBloc(),
child: MyHomePage(),
),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("BlocSelector 示例"),
),
body: Center(
child: BlocSelector<CounterBloc, CounterState, int>(
selector: (state) {
return state.count; // 選擇計數器的值作為所選值
},
builder: (context, count) {
return Text("$count");
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
context.read<CounterBloc>().add(IncrementEvent()); // 發送自定義事件
},
child: Icon(Icons.add),
),
);
}
}
程式碼解釋及比較Bloc5內容¶
第一段程式碼使用此Bloc6程式碼,第二段使用Bloc5
這兩段程式碼的主要差異在於它們使用的 BLoC 庫的不同部分,以及它們如何管理和更新狀態。
第一段程式碼使用的是 Bloc 類,它是一個更通用的狀態管理解決方案,可以處理更複雜的業務邏輯。它使用 CounterBloc 來管理狀態,並通過發送 IncrementEvent 事件來更新狀態。此外,它使用 BlocSelector 來選擇需要的狀態部分,並在狀態變化時重建小部件。
第二段程式碼使用的是 Cubit 類,它是一個更簡單的狀態管理解決方案,適合於業務邏輯較簡單的情況。它使用 CounterCubit 來管理狀態,並通過調用 increment 和 decrement 方法來更新狀態。此外,它使用 BlocBuilder 來在狀態變化時重建小部件。
總的來說,這兩段程式碼的主要差異在於它們使用的 BLoC 庫的部分以及它們如何管理和更新狀態。
Last update :
13 novembre 2024
Created : 13 novembre 2024
Created : 13 novembre 2024