Computer Science/Flutter

[Flutter] BlocListener vs BlocBuilder vs BlocConsumer ์ฐจ์ด

_cactus 2025. 4. 15. 16:57
๋ฐ˜์‘ํ˜•

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
๋ฐ˜์‘ํ˜•