BLoC ํจํด์ ์ฌ์ฉํ์๋ ๋ถ์ด๋ผ๋ฉด BlocProvider ๋ฅผ ์ฌ์ฉํ์ค๊ฒ๋๋ค. ์ค๋์ BlocProvider ๋ฅผ ์ข ๋ ์์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ด๋ฒ ๊ธ์ ์ ์ ๊ฐ๋ฐ ๊ฒฝํ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์ต๋๋ค.
์ด ๊ธ์์ ์์๋ณผ ๋ด์ฉ
- ๋ค๋ฅธ ์คํฌ๋ฆฐ์์ ๋์ผํ BlocProvider ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- BlocProvider ์ auto dispose ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ค๋ฅธ ์คํฌ๋ฆฐ์์ ๋์ผํ BlocProvider๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
BlocProvider ์ ์ค์ฝํ๋ ๊ฐ์ธ๊ณ ์๋ Widget ๊น์ง๊ฐ ๋ฒ์์ ๋๋ค. ๋ง์ฝ Navigator ๋ฅผ ํตํด ๋ค๋ฅธ ์คํฌ๋ฆฐ์ผ๋ก ์ ํํ๋ค๋ฉด ์ ํํ ํ๋ฉด์ BlocProvider ์ ์ค์ฝํ ๋ฐ์ ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฉ์ฒญํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
runApp(
BlocProvider(
create : () => TestBloc(),
child : MyApp()
),
);
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ๋ฌธ์ ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- BlocProvider ์ ์ค์ฝํ๊ฐ ์ฑ ์ ์ฒด๊ฐ ๋์ด๋ฒ๋ฆผ
- BlocProvider ์ ์ค์ฝํ๊ฐ ์ฑ ์ ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์ด์ฉ ์ ์์ด ์ฑ๊ธํค๊ณผ ๊ฐ์ ํํ๋ฅผ ๋๊ฒ ๋จ. ๋ฐ๋ผ์ Item ๋ณ๋ก ๊ฐ๊ฐ ๋ค๋ฅธ BlocProvider ๋ฅผ ์ ์ธํ์ง ๋ชปํจ.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฐ ๋ฌธ์ ๋ค์ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ํ ๊น์? ๋ฐ๋ก Navigator ๋ฅผ ์ด์ฉํ push ๋ฅผ ํ ๋ BuildContext ๋ฅผ arguments ๋ก ๊ฐ์ด ๋๊ฒจ์ฃผ๋ ๊ฒ ์ ๋๋ค. ๋ค์์ ์ฝ๋๋ฅผ ์ฃผ๋ชฉํ์ธ์.
class HomeScreen extends StatelessWidget {
const HomeScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text("Home_Screen"),
),
);
}
}
class HomeScreenArguments { // ์ค์
BuildContext context;
HomeScreenArguments({required this.context});
}
class TestScreen extends StatelessWidget {
const TestScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: InkWell(
onTap: () {
Navigator.of(context).pushNamed(
"home_screen",
arguments: HomeScreenArguments(context: context), // ์ค์
);
},
child: Text("click me"),
),
),
);
}
}
class MyRouter {
static Route<dynamic> generateRoute(RouteSettings settings) {
switch (settings.name) {
case "home_screen":
{
final args = settings.arguments as HomeScreenArguments;
return MaterialPageRoute(
builder: (context) => BlocProvider( // ์ค์
create: (context) => BlocProvider.of<HomeBloc>(args.context),
child: HomeScreen(),
),
);
}
}
}
}
์ฌ๋ฌ๋ถ์ ์ฝ๋์ ํํ๋ ์ ์ ๋ค๋ฅผ ์ ์์ต๋๋ค. ํ์ง๋ง ์ ๊ฐ Navigator ์ argument ํญ๋ชฉ์ ํตํด BuildContext ๋ฅผ ๋ฐ์์ค๊ณ MaterialPageRoute ์์ BlocProvider.of(args.context) ๋ฅผ ํตํด BlocProvider ์ค์ฝํ๋ฅผ ํ์ฅํ ๋ถ๋ถ์ ์ง์คํ์ญ์์ค. ์ด๋ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด BlocProvider ์ ์ค์ฝํ๋ฅผ ์ ์ฐํ๊ฒ ํ์ฅ์ํฌ ์ ์์ต๋๋ค.
BlocProvider ์ ์๋ dispose ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
BlocProvider ๋ ํด๋น ์คํฌ๋ฆฐ์ dispose ์ ๋ง์ถ์ด ์๋์ผ๋ก Bloc ์ Stream ์ ์๋์ผ๋ก dispose ํฉ๋๋ค. ๊ต์ฅํ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ด์ง๋ง ์ฌ๋ฌ๊ฐ์ ํ๋ฉด์์ Bloc ์ ์ฌ์ฉํ ๋๋ ์๋ฌ๋ฅผ ๋ฐ์ํ๋ ์์ธ์ด ๋ฉ๋๋ค. ์ ์ ๋ค๋ฅธ ํ๋ฉด์ผ๋ก ๋์ด๊ฐ์ ์์ ์ ํ๊ณ ๋ค์ ๋์์์ Bloc ์์ emit() ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
unhandled exception: bad state: cannot emit new states after calling close
์ด๋ Bloc ์ Stream ์ด dispose ๋์๊ธฐ ๋๋ฌธ์ ์๊ธฐ๋ ์ค๋ฅ์ ๋๋ค. ์ด๋ฏธ dispose ๋๊ธฐ ๋๋ฌธ์ ๋ ์ด์ emit() ํ ์ ์๋ค๋ ๊ฒ์ด์ฃ . ์ด๊ฒ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค. BlocProvider ์ autoDispose ๊ธฐ๋ฅ์ ๊บผ์ฃผ๋ฉด ๋๋๋ฐ์. ๊บผ์ฃผ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
BlocProvider.value(
value: BlocProvider.of<TestCubit>(context),
child: TestScreen(),
)
BlocProvider.vlaue() ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋๋ฐ์. BlocProvider.value() ๋ฅผ ์ฌ์ฉํ๋ฉด autoDispose ๊ธฐ๋ฅ์ด ๊บผ์ง๋๋ค. ์ด๋ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ํ๋ฉด์์ ๋์ผํ Bloc ์ ์ฌ์ฉํ๋ฉฐ ์์ ํ ์ ์์ต๋๋ค.
๋ง์น๋ฉด์
์ด๋ ๊ฒ ์ด๋ณด์๋ ์๋ชจ๋ฅด๋ BlocProvider ๊ฟํ์ ์์๋ดค์ต๋๋ค. ๋ค์๋ฒ์๋ BLoC ์ ์ ์ฌ์ฉํ ์ ์๋ ๊ฟํ์ผ๋ก ๋์์ค๊ฒ ์ต๋๋ค. ๊ธด๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
'Flutter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Flutter / Flutter GetX์ ๋ํด ์์๋ณด์ (0) | 2022.03.04 |
---|---|
Flutter ๊ธฐ์ด - 2ํ : ํ๋ฉด์ ๊ทธ๋ ค์ง๋ ๋ชจ๋ ๊ฒ์ ์์ ฏ์ด๋ค (0) | 2022.02.12 |
Flutter ๊ธฐ์ด - 1ํ : Flutter ์ ๊ณผ๊ฑฐ, ํ์ฌ, ๋ฏธ๋ (0) | 2021.12.17 |
Flutter Web 1ํ : ๊ตฌ๊ธ ์ฝ๋๋ฉ ๊ตฌํ (0) | 2021.07.20 |
Flutter Null Safety๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ (0) | 2021.07.02 |