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 class
かabstract 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();
以上! これでマルチプラットフォームでの実装ができるように。。(´ω`)
参考にしたサイトさま
- [Dart/Flutter] 専用ライブラリを作って、Conditional Importing(条件付インポート)でアプリとWebのソースを共存させる│Flutter Salon
- Flutter: import package only for web users - Stack Overflow
- 【Flutter】専用ライブラリ使用時のコンパイルエラーを回避する方法 #Flutter - Qiita
- Creating packages | Dart
- Implicit interfaces | Classes | Dart
- Dartにおける抽象化、Implicit interfaces について
- Dart Interface