[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 |