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 |