🌐

[Flutter web] dart:io を web で読まないプラットフォーム判定

2022/07/23に公開

軽く調べても、いまいち望みの結果が得られなかったので取り急ぎメモします。

結論

web を含む環境で Android 判定をしたい場合は以下のようにすると楽かもしれません。

!kIsWeb && Platform.isAndroid

背景

Android と iOS だけに対応した Flutter アプリを web でも動かしたくなった場合、dart:ioを利用することができません。

Important: Browser-based apps can't use this library.

実際に Platform.isAndroid のようなコードでは以下の実行時エラーが投げられます。

Unsupported operation: Platform._operatingSystem

解決策

universal_platform というパッケージがあります。これで UniversalPlatform.isAndroid のようなコードが web 環境でも使えるようになります。ただ、これはサードパーティ製のパッケージなので若干のアレルギーを発症する方も多いと思います。

そういう場合のシンプルな解決策は演算子の短絡評価の特性を用いて Platform.isAndroid のコードを web 環境で実行されないようにすることです。例えば論理積演算子(&&)を用いる場合は、web の場合だけ左辺で評価が終了するようにしておいて右辺の Platform.isAndroid を評価しないようにします。これは Android のみ真になる式です。

!kIsWeb && Platform.isAndroid

web または Android といった論理和判定も、論理和演算子は左辺が真の場合に右辺を評価しないので書くことができます。

kIsWeb || Platform.isAndroid

以上です。

Discussion