📦
Flutter で Zip を扱うパッケージを3つ試した
flutter_archive 5.0.0
Kotlin と Swift でプラグインを実装しているため、対応プラットフォームは Android と iOS / mac のみ
モバイルアプリど使う場合はこのパッケージを採用すれば良い感じがあったが、Zip作成後に展開時に壊れてしまうファイルがあったので採用見送り。採用してみて問題がなければおすすめではあると思うが、Android と iOS で別のコードなので不具合が合った時にちょっと不安
archive 3.3.6
Dart で実装されているのですべてのプラットフォームに対応ということになっている。
非同期関数が用意されていないため、そのまま使うと処理中にUIがフリーズする。isolateを使ってスレッドを分離して使うことになりそう
Zip 作成/展開時にメモリにすべてロードしてしまうため。ファイルが大きいとメモリ不足で失敗する。展開はInputFileStreamで展開すれば良いらしいが圧縮時の解決はなさそう?iOSで試したところ確保するメモリが少ないのか200MB程度で失敗するようになってしまった。
async_zip: ^0.0.2
非同期で使えて archive パッケージで起きるようなメモリの問題も解決されているためかなり使いやすい。
メンテされるのか怪しい。
3つほど動かしてみて async_zip が使いやすく、問題も起きない、FFIを使ったプラットフォームで分岐がないシンプルなコードで気に入ったので採用しましたが、依存しているFFIのバージョンが古いのでクローンして依存関係を解消して使っています。
メンテされていくか怪しいけどコードが少ないのでバージョンアップ等で動かなくなっても簡単にマイグレーションできるでしょうということでasync_zipを採用しました。
Discussion
最近のアップデートで
archive
パッケージに非同期メソッドextractArchiveToDiskAsync
が追加されました