Flutter WebでTargetPlatform
を指定しようとしたら、
TargetPlatform.web
がなかったので、
いろいろ調べたときの備忘録(*´ω`*)
Webの場合は、kIsWeb
を使わないといけない
TargetPlatform.web
やPlatform.isWeb
は存在しないっぽい。
また、ブラウザでPlatform.isAndroid
などを呼ぶとクラッシュする。
仕組みなどはこの記事に詳しく書かれている。
正しく判定したい場合は、TargetPlatform
とkIsWeb
を併用する感じ。
- macのブラウザ = TargetPlatform.macOS / kIsWeb=true
- iOSのアプリ = TargetPlatform.iOS / kIsWeb=false
- Androidのアプリ = TargetPlatform.android / kIsWeb=false
- Androidのブラウザ = TargetPlatform.android / kIsWeb=true
現在のPlatformを確認するサンプル
class App extends HookConsumerWidget { const App({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { // 現在のTargetPlatformの取得 TargetPlatform platform = Theme.of(context).platform; final platformName = "${platform.name}${kIsWeb ? "+web" : ""}"; debugPrint("platformName=$platformName, platform=$platform, isWeb=$kIsWeb"); // => platformName=macOS+web, platform=TargetPlatform.macOS, isWeb=true // 略 } }
TargetPlatformのコード
TargetPlatform
の定義はこんな感じ。
/// The platform that user interaction should adapt to target. /// The [defaultTargetPlatform] getter returns the current platform. enum TargetPlatform { /// Android: <https://www.android.com/> android, /// Fuchsia: <https://fuchsia.dev/fuchsia-src/concepts> fuchsia, /// iOS: <https://www.apple.com/ios/> iOS, /// Linux: <https://www.linux.org> linux, /// macOS: <https://www.apple.com/macos> macOS, /// Windows: <https://www.windows.com> windows, }
universal_platformのenum
universal_platformを使うとWebを含めた判定が楽になる。
// universal_platformのコード enum UniversalPlatformType { Web, Windows, Linux, MacOS, Android, Fuchsia, IOS } // 使い方 bool isIos = UniversalPlatform.isIOS; bool isWeb = UniversalPlatform.isWeb;
PageTransionsThemeでWebも考慮する
Map<TargetPlatform, PageTransitionsBuilder>
のような場合は、
kIsWeb
で渡すMap
を切り替えるといいっぽい。
final appTheme = ThemeData( pageTransitionsTheme: const PageTransitionsTheme( builders: kIsWeb // webの設定 ? { TargetPlatform.android: _webTransition, TargetPlatform.fuchsia: _webTransition, TargetPlatform.iOS: _webTransition, TargetPlatform.macOS: _webTransition, TargetPlatform.linux: _webTransition, TargetPlatform.windows: _webTransition, } // appの設定 : { TargetPlatform.android: _appTransition, TargetPlatform.fuchsia: _appTransition, TargetPlatform.iOS: _appTransition, TargetPlatform.macOS: _appTransition, TargetPlatform.linux: _appTransition, TargetPlatform.windows: _appTransition, }, ), );
以上!! マルチプラットフォーム、こういうのが大変。。(*´ω`*)