くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Flutterで特定のプラットフォームのときだけimportを切り替える(Conditional Import)

Flutterでdart:htmlなど特定のプラットフォームでしか動かないパッケージを
使いたいなと思ったときにいろいろ調べたときの備忘録(*´ω`*)

Conditional Import(条件付きインポート)という機能があるらしい。

Conditional Import

使い方はこんな感じ。

import 'src/hw_none.dart' // Stub implementation
    if (dart.library.io) 'src/hw_io.dart' // dart:io implementation
    if (dart.library.html) 'src/hw_html.dart'; // dart:html implementation

プラットフォームにより利用できるライブラリが異なるため、
特定のライブラリの有無により、importするファイルを切り替えることができる。

スタブの実装を用意する

どのプラットフォームでも利用できるように、
スタブの実装を用意する。

利用する関数などを全部用意する感じ。

// ** Stub implementation
// lib/src/hw_none.dart
void alarm([String? text]) => throw UnsupportedError('hw_none alarm');

String get message => throw UnsupportedError('hw_none message');

特定のライブラリがあるときの実装

特定のライブラリを使う実装を用意する。
スタブにある関数などをすべて実装する形。

// ** dart:io implementation
// lib/src/hw_io.dart
import 'dart:io';

void alarm([String? text]) {
  stderr.writeln(text ?? message);
}

String get message => 'Hello World from the VM!';

これで、特定のライブラリの有無によって、
それぞれのファイルがインポートされ、各関数を実行できるようになる。

Implict interfacesの活用

関数を定義するのもいいけど、クラスを使いたい場合もある。
その場合は、Implict interfacesを使うといい。

Dartには、インターフェースがないため、
concreate classabstract classを用意し、
implementsを使って実装する。

abstract class Logger {
  void log(String message);
}

class ConsoleLogger implements Logger {
  @override
  void log(String message) {
    print('Log "$message" to the console.');
  }
}

さっきの例だとこんな感じ。

// ** Stub implementation
// lib/src/hw_none.dart
class Hw {
  void alarm([String? text]) => throw UnsupportedError('hw_none alarm');

  String get message => throw UnsupportedError('hw_none message');
}

Hw getInstance() => Hw();
// ** dart:io implementation
// lib/src/hw_io.dart
import 'dart:io';
import './hw_none.dart';

class HwIo implement Hw {
  @override
  void alarm([String? text]) {
    stderr.writeln(text ?? message);
  }
  
  @override
  String get message => throw UnsupportedError('hw_none message');
}

Hw getInstance() => HwIo();

以上! これでマルチプラットフォームでの実装ができるように。。(´ω`)

参考にしたサイトさま