[Flutter] 외부 파일 읽기 및 쓰기

개시하다


Flutter로 파일을 읽고 쓰는 방법을 총괄했다.

만든 물건



현재 시간을 텍스트 데이터로 쓰는 프로그램
컨디션
기계: M1 맥북 에어
편집기:VScode
보관소: https://github.com/kenta-wakasa/flutter_playground

이루어지다


실례를 용서하십시오. 이것은 샘플 코드입니다.
페이지
io_page.dart
import 'package:flutter/material.dart';
// riverpod を使う場合は忘れずに pubspec.yaml を編集して pub get
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'io_controller.dart';

// ページは描画しているだけなので詳しい内容はコントローラーへ GO
class IoPage extends ConsumerWidget {
  const IoPage({Key key}) : super(key: key);
  static const String title = '外部データの入出力';
  
  Widget build(BuildContext context, ScopedReader watch) {
    final _ioProvider = watch(ioProvider);
    return Scaffold(
      appBar: AppBar(
        title: const Text(
          title,
          style: TextStyle(fontWeight: FontWeight.bold),
        ),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          children: [
            Text('アプリのローカルパス: \n${_ioProvider?.appPath}'),
            Padding(
              padding: const EdgeInsets.all(16),
              child: SizedBox(
                  height: 25,
                  child: FittedBox(
                    fit: BoxFit.fitHeight,
                    child: Text(
                      _ioProvider.content,
                    ),
                  )),
            ),
            Center(
              child: ElevatedButton(
                onPressed: () async {
                  await _ioProvider.write();
                  await _ioProvider.read();
                },
                child: const Text('いまの時間を書き込む'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
컨트롤러
io_controller.dart
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:path_provider/path_provider.dart';

final ioProvider = ChangeNotifierProvider.autoDispose<IoController>(
  (ref) => IoController(),
);

class IoController extends ChangeNotifier {
  IoController() {
    /// 初期化処理をここに書く
    /// コンストラクタで非同期処理をやりたい場合どうすのがいいんでしょう?
    () async {
      content = 'ファイルに書き込まれた時間を表示します';
      final _localPath = await localPath;
      appPath = '$_localPath/playground/';
      appDirectory = Directory(appPath);

      /// 新しくディレクトリをつくる
      await appDirectory.create(recursive: true);
    }();
  }

  
  void dispose() {
    super.dispose();
  }

  String appPath;
  String content;
  Directory appDirectory;

  /// ローカルパスの取得
  Future<String> get localPath async {
    final directory = await getApplicationDocumentsDirectory();
    notifyListeners();
    return directory.path;
  }

  /// 現在時刻の書き込み
  Future<void> write() async {
    final file = File('$appPath/test.txt');
    print('write: ${file.path}');
    await file.writeAsString(DateTime.now().toString());
  }

  /// 現在時刻の読み込み
  Future<void> read() async {
    final file = File('$appPath/test.txt');
    content = await file.readAsString();
    notifyListeners();
  }
}

해설

  • 우선 path
  • 획득
  • 읽기와 쓰기 방법 알아
  • 1. 우선 path 획득


    프로그램이 제공하는 고유 path 정보를 가져와야 합니다.
    path의 사용 허가path_provider 포장.
    final directory = await getApplicationDocumentsDirectory();
    final path = directory.path;
    
    이번에는 iOS로, 안드로이드도 마찬가지로 이동한다고 한다.

    2. 책을 읽고 글씨를 쓰는 방법을 안다


    파일의 읽기와 쓰기는 io라는 프로그램 라이브러리를 사용합니다.

    디렉토리 만들기


    final directory = Directory('作りたいディレクトリの path');
    await directory.create(recursive: true);
    

    파일 읽기


    final file = File('読み込みたいファイルの path');
    final String content = await file.readAsString(); // テキストデータならこう書く
    

    파일 쓰기


    final file = File('書き込みたいファイルの path');
    await file.writeAsString(DateTime.now().toString()); // テキストデータならこう書く
    
    이상!

    iOS Files에는 어떻게 표시됩니까?


    Files 앱에'아이폰 안'이라는 디렉터리가 있는데 여기에 적힌 데이터를 표시하려면 어떻게 해야 하나요?

    info.plist에 추기


    info.plist
    <!-- on my iPhone (このiPhone内) に表示させるために必要  -->
        <key>LSSupportsOpeningDocumentsInPlace</key>
        <true/>
        <key>UIFileSharingEnabled</key>
        <true/>
    <!-- //////////////////////////////////////////// -->
    
    이 두 개를 추모하면 돼!

    최후

    좋은 웹페이지 즐겨찾기