【Flutter】条件付きインポート

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【Flutter】条件付きインポート

2024-7-18 | ,

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!";
  }
}

インターフェイス側の静的関数を使おうとすると例外を発生させる感じ。

まとめ(感想文)

コツはいるんだけども、ひとつのプロジェクトでいろんなプラットフォームに対応できるのはいいね!