본문 바로가기
플러터

flutter : context 가져오기

by s2jinny 2024. 6. 15.

https://velog.io/@adbr/context-%EC%97%86%EB%8A%94-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%ED%99%94%EB%A9%B4-%ED%98%B8%EC%B6%9C

 

[flutter] context 없는 환경에서 화면 호출, current context 가져오기

global 하게 변수들을 담을 수 있는 클래스와 globalKey 타입의 static변수 선언dart file name: candy_global_variable.dartclass: CandyGlobalVariablemain.dart 파일에 기입된 MaterialApp

velog.io

이거 보고 참조 함. 

context 없는 곳에서 가져오는 방법 

1. 글로벌로 static 선언해준다.

2. 사용한다.끝.

 

저같은 경우는 context 가 없는 환경 : Bloc 안에서 선언을 해주었는데요.

class MyEbookDownloadBloc
    extends Bloc<MyEbookDownloadEvent, MyEbookDownloadState> {
  MyEbookDownloadBloc() : super(const MyEbookDownloadState.initial()) {
    on<MyEbookDownloadEvent>(
          (event, emit) async {
        await event.map(
          downloadEbook: (event) async {
            emit(const MyEbookDownloadState.progress());
            try {
              final ServerResponse response =
              await _finalSubmissionRepository.downloadEbook(
                storyId: event.storyId,
              );

              final String downloadLink = response.data as String;

              if (Platform.isIOS) {
                final flutterMediaDownloaderPlugin = MediaDownload();
                final context = CandyGlobalVariable.navigatorState.currentContext;
                await flutterMediaDownloaderPlugin.downloadMedia(context!, downloadLink);
                Fluttertoast.showToast(msg: 'PDF 다운로드 성공! 파일을 통해 확인해보세요!');
              } else if (Platform.isAndroid) {
                await FileDownloader.downloadFile(
                  url: downloadLink,
                  name: 'ChooseMe.pdf',
                  onDownloadCompleted: (path) {
                    Fluttertoast.showToast(
                        msg: 'PDF 다운로드 성공! 내 파일(문서) 혹은 상단바를 통해 확인해보세요!');
                  },
                  onDownloadError: (error) {
                    Fluttertoast.showToast(msg: 'PDF 파일 다운로드 실패: $error');
                  },
                );
              }
            } catch (e, s) {
              emit(MyEbookDownloadState.failure(errMsg: e.toString()));
              Fluttertoast.showToast(msg: 'PDF 다운로드 실패: (전자책 정보 없음)');
            }
          },
        );
      },
    );
  }

  final FinalSubmissionRepository _finalSubmissionRepository =
  ServiceInjector.injector();
}

 

앱 내에서 e-book pdf 다운로드 하는 코드에서  전역변수로 선언해 주었던 context를 가지고 와서 context를 사용할 수 있습니다.

import 'package:flutter/material.dart';

/// Global variables
/// * [GlobalKey<NavigatorState>]
class CandyGlobalVariable {
  static final GlobalKey<NavigatorState> navigatorState =
  GlobalKey<NavigatorState>();
}

 

여기에 전역으로 선언한 것을 

                final context = CandyGlobalVariable.navigatorState.currentContext;

 

가져오고요 , 이걸 사용하기 위해 최 상위에 라우터 .dart 파일에 선언을 해줍니다.

final GoRouter router = GoRouter(
  initialLocation: '/',
  navigatorKey: CandyGlobalVariable.navigatorState,

 

라우터코드에 넣어줬는데 라우터 코드가 따로 없으면 main.dart파일안에 선언하시면 됩니다! 

 

ios 파일안에서 잘 다운이 되며, 번외로 share_plus 를 사용하면 공유기능-> 카카오톡으로 공유하기 해서 더더욱 빠르게 다운로드를 할 수 있습니다. 저는 앱 내 직접 다운 받는 코드로 했습니다.

 

쉽다 쉬워.

라며 자신을 가스라이팅하며 공부합니다

'플러터' 카테고리의 다른 글

Pagination 페이지네이션이란  (0) 2024.06.28
flutter : DioInterceptor  (0) 2024.06.15
Riverpod 프로바이더 종류  (0) 2024.04.09
bloc  (2) 2024.03.29
FCM .. 알림 설정  (1) 2024.03.17