Nguồn : Bloc State Management Library
I. Bloc Widgets
BlocBuilder :
Là một widget dùng để build lại UI mỗi khi có state mới. Blocbuilder sẽ thực hiện tìm kiếm BlocProvider
dựa trên context hiện tại.
builder : Trả hàm builder trả về một widget dựa trên state của bloc
bloc : chỉ định bloc local, giá trị này chỉ sử dụng bên trong phạm vi của BlocBuilder
buildWhen : cung cấp previousState và state, dựa vào 2 giá trị này để bạn quyết định có muốn build lại hay không.
BlocBuilder<BlocA, BlocAState>(
bloc: blocA, // provide the local bloc instance
buildWhen: (previousState, state) {
// return true/false to determine whether or not
// to rebuild the widget with state
},
builder: (context, state) {
// return widget here based on BlocA's state
}
)
BlocSelector :
Là widget tương tự BlocBuilder
. Nhưng nó cho phép lọc các cập nhật các giá trị mới dựa trên state hiện tại của bloc. Nghĩa là không cần thiết phải build lại khi giá trị được chọn không thay đổi.
BlocSelector<BlocA, BlocAState, SelectedState>(
selector: (state) {
// return selected state based on the provided state.
},
builder: (context, state) {
// return widget here based on the selected state.
},
)
BlocProvider :
Là widget cung cấp bloc cho các widget con. Các widget có thể truy cập bloc thông qua đoạn code BlocProvider.of(context)
. Nó dùng dependency injection (DI) nên chỉ có một instance được tạo ra phục vụ cho nhiều widget.
BlocProvider sẽ tự động đóng bloc nên chúng ta không cần bận tâm khi nào nên đóng bloc.
create : hàm này trả yêu cầu trả về một Bloc.
child : Widget được cung cấp bloc.
lazy : mặc định bloc chỉ được tạo khi nó được dùng, nghĩa là ở đâu đó có gọi
BlocProvider.of(context)
. Set lazy làfase
nếu muốn bloc tạo ngay lập tức.
BlocProvider(
create: (BuildContext context) => BlocA(),
child: ChildA(),
lazy: false,
);
Trường hợp trên bloc sẽ luôn được tạo mới, trường hợp bạn muốn dùng lại bloc có sẵn, thì dùng BlocProvider.value
BlocProvider.value(
value: BlocProvider.of<BlocA>(context),
child: ScreenA(),
);
//Truy cập BlocA từ ScreenA sẽ dùng :
context.read<BlocA>();
//Thay vì :
BlocProvider.of<BlocA>(context)
Lưu ý : BlocProvider được tạo từ BlocProvider.value
sẽ không tự đóng bloc.
MultiBlocProvider :
Là widget hỗ trợ tạo nhiều bloc thay vì chỉ một như BlocProvider
- providers : một danh sách các BlocProvider
MultiBlocProvider(
providers: [
BlocProvider<BlocA>(
create: (BuildContext context) => BlocA(),
),
BlocProvider<BlocB>(
create: (BuildContext context) => BlocB(),
),
BlocProvider<BlocC>(
create: (BuildContext context) => BlocC(),
),
],
child: ChildA(),
)
BlocListener :
- listener : TBD
BlocListener<BlocA, BlocAState>(
listener: (context, state) {
// do stuff here based on BlocA's state
},
child: Container(),
)
bloc: Chỉ chỉ định bloc nếu bạn muốn cung cấp bloc, bloc này không thể truy cập thông qua
BlocProvider
vàBuildContext
hiện tại.listenWhen : dựa vào
previousState
vàstate
để quyết định có lắng nghe không
BlocListener<BlocA, BlocAState>(
bloc: blocA,
listenWhen: (previousState, state) {
// return true/false to determine whether or not
// to call listener with state
},
listener: (context, state) {
// do stuff here based on BlocA's state
},
child: Container()
)
MultiBlocListener :
Hỗ trợ tạo nhiều BlocListener
.
MultiBlocListener(
listeners: [
BlocListener<BlocA, BlocAState>(
listener: (context, state) {},
),
BlocListener<BlocB, BlocBState>(
listener: (context, state) {},
),
BlocListener<BlocC, BlocCState>(
listener: (context, state) {},
),
],
child: ChildA(),
)
BlocConsumer :
Là widget cung cấp m