๋ฐ์ํ
BlocBuilder vs BlocListener
์ํ ๋ณ๊ฒฝ ์ UI๋ฅผ ๋ค์ ๊ทธ๋ฆผ | ์ํ ๋ณ๊ฒฝ ์ side effect (๋ก์ง ์คํ) |
Widget build ์์์ ์ฌ์ฉ | ๋ณดํต Scaffold ๊ทผ์ฒ์ ์์น |
์: ListView, ๋ฒํผ ์ํ ๋ณ๊ฒฝ | ์: SnackBar, Navigator.pop() ๋ฑ |
return BlocListener<TestBloc, TestState>(
listenWhen: (previous, current) =>
previous.status != current.status, // ์ํ๊ฐ ๋ณํ ๋๋ง ๋ฐ์
listener: (context, state) {
if (state.status == ApiStatus.error) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(state.errMsg)),
);
}
if (state.status == ApiStatus.succeeded) {
Navigator.of(context).pop(); // ํน์ ๋ค๋ฅธ ์ฒ๋ฆฌ
}
},
child: Scaffold(
appBar: AppBar(title: Text('Sample Test')),
body: ...,
),
);
BlocConsumer
๋ง์ฝ UI๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๊ณ side effect๋ ๊ฐ์ด ํ๊ณ ์ถ๋ค๋ฉด BlocConsumer๋ฅผ ์ฐ๋ฉด ๋ฉ๋๋ค
BlocConsumer<TestBloc, TestState>(
listener: (context, state) {
if (state.status == ApiStatus.error) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(state.errMsg)),
);
}
},
builder: (context, state) {
return state.status == ApiStatus.loading
? CircularProgressIndicator()
: YourMainUI();
},
);
728x90
๋ฐ์ํ