flutter path_provider 사용하여 폴더 경로 가져오기
오늘은 flutter로 앱이 설치되어 있는 경로와 임시 폴더의 경로를 찾을 수 있는 path_provider 패키지에 대하여 알아보려 합니다.
에뮬레이터 및 기기 준비하기
안드로이드나 ios 앱으로 테스트할 장치를 준비해야 합니다.
준비했으면, 미리 기기 또는 에뮬레이터를 ide에 연결해줍니다.
pubspec.yaml 작성하기
dependencies:
flutter:
sdk: flutter
path_provider:
flutter 앱에 앱의 경로와 앱이 사용하고 있는 임시 폴더의 경로를 알아내기 위해서 path_provider 패키지를 pubspec.yaml에 작성해줍니다.
main.dart 앱 코드 작성하기
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';
앱에 머티리얼 위젯을 추가할 수 있는 material 패키지와 패키지의 정보를 추가할 수 있게 해주는 path_provider 패키지를 가져옵니다.
그리고 디렉토리를 가져오기 위해 다트 패키지인 io도 가져와줍니다.
void main() => runApp(MyApp());
앱을 MyApp으로 구동합니다.
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter path_provider',
home: MyHomePage(),
);
}
}
머티리얼 디자인으로 감싸진 MyHomePage 객체를 화면에 그려줍니다.
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
StatefulWidget으로 버튼, 슬라이더, 체크 박스처럼 사용자와 상호작용하여 위젯이 변화하는 것을 묶어줍니다.
createState 메소드를 오버라이딩하여 _MyHomePageState 객체를 생성해줍니다.
class _MyHomePageState extends State<MyHomePage> {
Future<Directory> _tempDir;
Future<Directory> _appDir;
Future<Directory> _externalDir;
임시 폴더, 앱 폴더, 외장 메모리 폴더를 Directory 형태인 Future로 선언해줍니다.
@override
void initState() {
super.initState();
_requestTempDir();
_requestAppDir();
_requestExternalDir();
}
initState를 오버라이딩하여 임시, 앱, 외장 메모리 디렉토리를 요청합니다.
void _requestTempDir() {
setState(() {
_tempDir = getTemporaryDirectory();
});
}
getTemporaryDirectory 를 수행하여 _tempDir에 임시 파일 디렉토리를 반환합니다.
void _requestAppDir() {
setState(() {
_appDir = getApplicationDocumentsDirectory();
});
}
getApplicationDocumentsDirectory 를 수행하여 _appDir에 앱 문서 디렉토리를 반환합니다.
void _requestExternalDir() {
setState(() {
_externalDir = getExternalStorageDirectory();
});
}
getExternalStorageDirectory 를 수행하여 _externalDir에 외장 메모리 디렉토리를 반환합니다.
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FutureBuilder<Directory>(
future: _tempDir,
builder: (BuildContext context, AsyncSnapshot<Directory> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasData) {
return Text('path: ${snapshot.data.path}');
} else {
return const Text('path unavailable');
}
}
},
),
builder에 의하여 _tempDir의 future를 스냅샷으로 전달합니다.
만약 snapshot.hasData으로 데이터가 존재하면 snapshot.data.path을 출력해서 임시 파일 디렉토리 경로를 문자열로 출력하게 됩니다.
FutureBuilder<Directory>(
future: _appDir,
builder: (BuildContext context, AsyncSnapshot<Directory> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasData) {
return Text('path: ${snapshot.data.path}');
} else {
return const Text('path unavailable');
}
}
},
),
builder에 의하여 _appDir의 future를 스냅샷으로 전달합니다.
만약 snapshot.hasData으로 데이터가 존재하면 snapshot.data.path을 출력해서 앱 디렉토리 경로를 문자열로 출력하게 됩니다.
FutureBuilder<Directory>(
future: _externalDir,
builder: (BuildContext context, AsyncSnapshot<Directory> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasData) {
return Text('path: ${snapshot.data.path}');
} else {
return const Text('path unavailable');
}
}
},
),
],
),
);
}
}
builder에 의하여 _externalDir의 future를 스냅샷으로 전달합니다.
만약 snapshot.hasData으로 데이터가 존재하면 snapshot.data.path을 출력해서 외장 메모리 경로를 문자열로 출력하게 됩니다.