Flutterで条件付きインポートを使っていろんなプラットフォームに対応したプロジェクトを作りたい!
概要
今回の記事では、Flutterで条件付きインポートを使っていろんなプラットフォームに対応したプロジェクトを作る手順を掲載する。
複数のプラットフォームに対応する場合、対応してないパッケージをインポートするとパッケージによってはインポートした時点でビルドできなくなることもあるので、条件付きインポートでビルド対象のプラットフォームによってインポートするパッケージを切り替える。
仕様書
環境
- Android Studio Jellyfish | 2023.3.1 Patch 2
- Flutter 3.22.2
手順書
条件付きインポートは、下記のようにif
を使う。
import 'io_stub.dart'
if (dart.library.html) 'io_web.dart'
if (dart.library.io) 'io_native.dart';
この例ではWEBアプリのビルド時に'io_web.dart'、AndroidやiOSやWindowsなどのネイティブアプリのビルド時には'io_native.dart'がインポートされる。先頭の'io_stub.dart'は前述のいずれでもなかった場合にインポートされる。
インターフェイスを使うことで多様性(ポリモーフィズム)的に処理できる。
io_interface.dart
にインターフェイスを作る。
abstract class InterfaceIo {
String read();
void Write(String str);
}
io_web.dart
にWEBアプリのビルド時の処理。
import 'io_interface.dart';
class Io implements InterfaceIo {
@override
String read()
{
return "Nya-n!";
}
@override
void write(String str) {
return;
}
}
io_native.dart
にネイティブアプリのビルド時の処理。
import 'io_interface.dart';
class Io implements InterfaceIo {
@override
String read()
{
return "wa-n!";
}
@override
void write(String str) {
return;
}
}
io_stub.dart
にその他のビルド時の処理。
import 'io_interface.dart';
class Io implements InterfaceIo {
@override
String read()
{
return "yaeh!";
}
@override
void write(String str) {
return;
}
}
使い方。
import 'io_stub.dart'
if (dart.library.html) 'io_web.dart'
if (dart.library.io) 'io_native.dart';
var io = Io();
debuPrint(io.read());
ビルドするプラットフォームによって出力される文字列が変わる。
静的な関数をインターフェイスで使いたい場合、擬似的に下記のような感じで実装できる。
abstract class InterfaceIo {
static String read(String str) {
throw UnimplementedError('Implement static method!!!!');
}
}
同様に@override
を使う。
import 'io_interface.dart';
class Io implements InterfaceIo {
@override
static String read()
{
return "Nya-n!";
}
}
インターフェイス側の静的関数を使おうとすると例外を発生させる感じ。
まとめ(感想文)
コツはいるんだけども、ひとつのプロジェクトでいろんなプラットフォームに対応できるのはいいね!