void main() async{
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context) {
return MultiProvider();
}
}
자! Main 파트에 Firestore를 주입해보자
Firebase 는 로딩이 조금 걸리는 경우가 있다.
그래서 async, await패턴을 사용한다
프로바이더 패턴을 위해 MaterialApp을 Wrap With MultiProvider 한다
클래스 MultiProvider의 선언은 ChangeNotifierProvider의 List를 파라미터공간 provider에 예약한다.
클래스 ChangeNotifier를 계승한 가변 데이터타입< T >가 클래스 ChangeNotifierProvider 파라미터공간에 예약되어있다
(번외)클래스 안의 함수를 사용하고자 하면 그냥 사용하면 된다 하지만 파라미터 공간에 예약된 데이터타입에 맞게 들어 있어야한다
(번외)클래스의 생성자는 원래는 TheClass.TheClass() 라는 형식으로 사용되어야 하지만 편의상 그냥 생략한듯 하다 원래 클래스내의 함수는 그냥 사용할 수 있는게 룰인듯 하다
생성자의 리턴 값을 인스탄스라고 한다 생성자는 런타임 프로세스다
클래스 안의 변수를 활용해야 하면 인스탄스 리턴 시켜야 한다는 것이다
보통, 메테리얼앱() => 사용자 클래스.@오버라이드 build() => 스캐폴드 형식이다
Wrap with Multi Provider 쓰는 방법도 있고, 그냥 class 선언 내에서 변수에 맡겼다
주입되는 state는 changeNotifier를 계승한것
~~await Firebase.ensureInitialized();~~
//deprecated 됬나?
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(create: () => AppState()),
ChangeNotifierProvider(create: () => AuthState()),
ChangeNotifierProvider()),
ChangeNotifierProvider(create: () => ChatUserState()),
ChangeNotifierProvider(create: () => Searchstate>(create: () => SearchState()),
ChangeNotifierProvider
(create:() => NotificationState()),
],
child: MaterialApp(
title: 'Fwitter',
theme: AppTheme.apptheme.copyWith(
textTheme: GoogleFonts.muliTextTheme(
Theme.of(context).textTheme,
),
),
debugShowCheckedModeBanner: false,
routes: Route.route(),
onGenerateRoute:(settings) => Routes.onGenerateRoute(settings),
onUnknownRoute:(settings) => Routes.onUnknownRoute(settings),
),
);
}
}
하고 스테이트가 필요할 때에는 라우터에서 스테이트를 프로바이딩한다
만약에 스테이트를 firestore가 아닌 mysql 이나 다른 db서버에서 받아오고 이를 https 나 http와 같은 프로토콜과 json 데이터 타입을 통해서 가져온다하더라도 jsonToMap 서브루틴을 통해서 자체적으로 변환할수 있다.
Main 구현부분은 세가지로 나뉠 수 있다.
void main 선언
MultiProvider 주입선언부
MaterialApp 주입 선언부이다
이 전에 AppState와 HomePage그리고 SplashPage는 미리 선언되어 있어야 되겠다