FlutterのFileとXFileとの違い
小ネタ記事です。Flutterで画像やファイルを扱うときに型やClassとしてXFile
やFile
を使っている記事を見ますが、XFile
とFile
とを相互変換しているかのような記事を見かけたり、そもそもXFile
って何?File
と何が違うの?と混乱した記憶があったので、改めて整理して紹介します。
なお、この記事はFlutter Advent Calendar 2022の17日目の記事になります。
File
File Classはdart.io
ライブラリで提供されているファイルシステム上のファイルへの参照、読み込みや書き込みをするためのClassです。
なお、XFileとの大きな違いとして、大元となるdart.io
ライブラリが非Webアプリケーションでのみサポートされているため、Webアプリケーションでは使えません。
Important: Browser-based apps can't use this library. Only the following can import and use the dart:io library:
https://api.dart.dev/stable/2.18.6/dart-io/dart-io-library.html
Fileの扱い方
Fileのサンプルは以下のとおりです。後述するXFileと記述は基本的に同じですが、ファイルへの書き込み(writeAsString
)や、作成(watch
)まで、ファイルを操作するための機能が網羅的にサポートされています。
import 'dart:io';
final filename = 'file.txt';
var file = await File(filename).writeAsString('some content');
参考
XFile
XFile Classはクロスプラットフォーム用に抽象化されたClassです。
選択されたファイルのbyteデータ、プラットフォーム依存のpathをラップした形式になります。
File
と違って、ファイルの作成や直接書き込みのメソッドは提供されていません。全てのプラットフォームでサポートされているがゆえの制限です。
pub.devの中でも人気なimage_pickerも、返されるデータがXFile
であったり、最近よく使われている形式です。
ちなみに、XFileはcross_file
のimportが必須でしたが、Flutter2.8以降では明示的なimportが不要になりました。
XFileの扱い方
XFileもFileと同様な使い方が可能です。
final filename = 'file.txt';
var file = await XFile(filename).readAsBytes();
画像として扱う場合は、File型をreadAsBytes
メソッドで、いったんUint8List
型に変換し、
それをdecodeImage
メソッドなどで、Image
型に変換します。
final Uint8List bytes = await XFile(filename).readAsBytes();
また、byteデータに変換することでhttp.MultipartFile
のPOSTデータとして扱えます。
http.MultipartFile.fromBytes(
'file',
bytes,
filename: file.name,
)
Discussion