인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

박상우님의 프로필 이미지
박상우

작성한 질문수

[Bloc 응용] 실전 앱 만들기 (책 리뷰 앱) : SNS 로그인, Firebase 적용, Bloc 상태 관리, GoRouter

초기 페이지 연결하기

초기 페이지 연결하기

해결된 질문

작성

·

421

·

수정됨

0

초기 페이지 연결하기 관련하여 스터디중에 있는데요

앱 실행은 잘 되는데 실행하자 마자 아래와 같이

에러가 발생하고 있는데 이게 어떤것때문에 그런지 알 수있을까요?

RootPage를 호출하면서 발생이 되더라구요

확인 부탁 드려요!스크린샷 2023-07-08 오후 12.27.42.png

답변 4

0

개발하는남자님의 프로필 이미지
개발하는남자
지식공유자

안녕하세요 소스 확인해보니 main.dart 파일에 잘못된 연결점이 있었습니다.

main() 함수에서 runApp에 MyApp 위젯을 연결해줘야하는데 바로 App 페이지로 연결되어있기 때문에 문제가 발생되었습니다.

 void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  HydratedBloc.storage = await HydratedStorage.build(
    storageDirectory: await getApplicationDocumentsDirectory(),
  );
  Dio dio = Dio(BaseOptions(baseUrl: 'https://openapi.naver.com/'));
  dio.interceptors.add(CustomInterceptor());
  runApp(MyApp(dio: dio));
}

이렇게 소스 수정해주시면 정상적으로 작동될 것입니다.

감사합니다.

박상우님의 프로필 이미지
박상우
질문자

내용 확인하여 수정해서 동작 확인 하였습니다.

도움주셔서 감사합니다! :)

0

개발하는남자님의 프로필 이미지
개발하는남자
지식공유자

소스상에는 크게 문제될 부분은 없어보이는데 ...

아무래도 소스를 전달 받아서 제가 직접 돌려봐야 확인이 가능 할 것 같습니다.

불편하시겠지만 소스를 mousai86@gmail.com 으로 보내주시면 소스 확인해서

답변드리도록 하겠습니다.

 

박상우님의 프로필 이미지
박상우
질문자

빠른 답변 감사합니다.

위에 메일로 소스 첨부 전달하였습니다.

0

개발하는남자님의 프로필 이미지
개발하는남자
지식공유자

죄송하지만 app.dart 파일 소스도 같이 알려주시면 문제 확인에 도움이 될 것 같습니다 ^^;

박상우님의 프로필 이미지
박상우
질문자

네 확인 감사합니다.

app.dart는 아래와 같이 되어 있습니다.

 

class App extends StatefulWidget {
  const App({super.key});

  @override
  State<App> createState() => _AppState();
}

class _AppState extends State<App> {
  late GoRouter router;

  @override
  void initState() {
    super.initState();

    router = GoRouter(
      initialLocation: "/",
      routes: [
        GoRoute(
            path: '/',
            builder: (context, state) => const RootPage(),
        ),
        GoRoute(
          path: '/login',
          builder: (context, state) => const LoginPage(),
        ),
      ],
    );
  }


  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerConfig: router,
      theme: ThemeData(
        appBarTheme: const AppBarTheme(
          elevation: 0,
          backgroundColor: const Color(0xff1C1C1C),
          titleTextStyle: TextStyle(color: Colors.white),
        ),
        scaffoldBackgroundColor: const Color(0xff1C1C1C)
      ),
    );
  }
}

0

개발하는남자님의 프로필 이미지
개발하는남자
지식공유자

오류 내용은 InitCubit 이 create 되고 다음 하위 BuildContext에서 접근을 해야하는데 동일 depth에서 접근을 하려고해서 발생되는 오류입니다.

InitCubit을 main.dart 파일내에 MyApp 위젯에서 등록을 해줬을까요? 아니면 app.dart 파일 내에서 등록을 해줬을까요?

또한 InitCubit의 경우 BlocProvider를 통해 생성을 할때에 lazy 옵션을 false로 세팅을 해줬을까요?

2가지 체크포인트 확인해봐주시겠어요??

박상우님의 프로필 이미지
박상우
질문자

답변 감사 드립니다.

 

  1. InitCubit을 main.dart 파일내에 MyApp 위젯에서 아래와 같이 등록이 되어 있습니다.

  2. lazy 옵션을 false로 되어 있는 상태입니다.

아래와 같이 코딩되어 있는데 어느부분이 문제 되는것일까요?ㅠ

main.dart

class MyApp extends StatelessWidget {
  final Dio dio;
  const MyApp({super.key, required this.dio});

  @override
  Widget build(BuildContext context) {
    return MultiRepositoryProvider(
      providers: [
        RepositoryProvider(create: (context) => NaverBookRepo(dio),
        )
      ],
      child: MultiBlocProvider(
          providers: [
            BlocProvider(create: (context) => InitCubit(),lazy: false,), 
            BlocProvider(create: (context) => AppDataLoadCubit(),lazy: false,),
            BlocProvider(create: (context) => SplashCubit(),),
          ],
          child: App()),
    );
  }
}

 

root_page.dart

class RootPage extends StatelessWidget {
  const RootPage({super.key});

  @override
  Widget build(BuildContext context) {
    return BlocBuilder<InitCubit, bool>(
      builder: (context, state) {
        return state ? const SplashPage() : const InitPage();
      },
    );
  }
}

Init_cubit.dart

class InitCubit extends HydratedCubit<bool> { 
  InitCubit() : super(false); 

  void startApp() {
    emit(true);
  }

  @override
  bool fromJson(Map<String, dynamic> json) => json['state'] as bool;

  @override
  Map<String, bool> toJson(bool state) => { 'state': state };
}

 

박상우님의 프로필 이미지
박상우

작성한 질문수

질문하기