Flutter:我能知道我在哪个平台吗?

问题描述 投票:0回答:5

我正在开发一个项目,该项目既可以作为应用程序也可以作为网页使用。我正在使用 flutter_secure_storage 来存储应用程序的本地数据,但我需要一种不同的网络方法。 有没有办法让我在运行时知道我所在的平台,并相应地选择正确的读写函数?

flutter flutter-web
5个回答
9
投票

您可以将此扩展文件添加到项目中并调用任何对象

目标.dart

import 'dart:io';
import 'package:flutter/foundation.dart' show kIsWeb;

extension Target on Object {
  bool isAndroid() {
    return Platform.isAndroid;
  } 
  bool isIOS() {
    return Platform.isIOS;
  } 
  bool isLinux() {
  return Platform.isLinux;
  } 
  bool isWindows() {
  return Platform.isWindows; 
  }
  bool isMacOS() {
  return Platform.isMacOS; 
  }
  bool isWeb() {
  return kIsWeb; 
  }
  // ···
}

并将其导入到任何地方并像这样使用它

@override
  Widget build(BuildContext context) {
    return isAndroid()? Text("Android"):Text("Not Android");
  }

4
投票

对于网络,您使用:

if(kIsWeb) //returns a boolean if your app is running in a browser.

对于其他平台,您使用

Platform

Platform.isAndroid
Platform.isIos
Platform.isLinux

在调用

Platform.is
之前,请务必先检查您是否在网络上运行,因为它会抛出一个异常,表明平台不适用于此环境。


2
投票

如何检测 Flutter 应用程序运行的平台: Flutter 提供了两种不同的 API,使调用者能够更多地了解当前平台:作为基础库一部分的 kIsWeb 常量和作为平台库一部分的 Platform 类。 代码链接: https://www.flutterclutter.dev/flutter/tutorials/how-to-detect-what-platform-a-flutter-app-is-running-on/2020/127/

 import 'dart:io';
 import 'package:flutter/foundation.dart' show kIsWeb;
 class PlatformInfo {
 bool isDesktopOS() {
  return Platform.isMacOS || Platform.isLinux || Platform.isWindows;
 }
 bool isAppOS() {
 return Platform.isMacOS || Platform.isAndroid;
  }
 bool isWeb() {
 return kIsWeb;
}
 PlatformType getCurrentPlatformType() {
  if (kIsWeb) {
     return PlatformType.Web;
}
  if (Platform.isMacOS) {
  return PlatformType.MacOS;
}
  if (Platform.isFuchsia) {
  return PlatformType.Fuchsia;
}
if (Platform.isLinux) {
  return PlatformType.Linux;
}
if (Platform.isWindows) {
  return PlatformType.Windows;
}
if (Platform.isIOS) {
  return PlatformType.iOS;
}
if (Platform.isAndroid) {
  return PlatformType.Android;
}
return PlatformType.Unknown;
}
}
enum PlatformType {
 Web,
 iOS,
 Android,
 MacOS,
 Fuchsia,
 Linux,
 Windows,
 Unknown
 }

这使得可以轻松地根据操作系统或底层平台组做出决策:

Text _getMicrophoneSection() {
 if (PlatformInfo.isAppOS()) {
  return Text('Please tap the microphone button and then permit the              usage');
  }
 return Text('If you have a microphone available, please turn it on');

}


0
投票

为了检测 Flutter 是否是为 Web 编译的,您可以使用包中的 kIsWeb

import 'package:flutter/foundation.dart'
。对于 Android、IOS、Windows、Mac 等其他环境,您可以使用 Platform class like

Platform.IsWindows


0
投票

我认为这个问题没有得到正确的回答。因此,对于像我一样发现自己在这里的任何人......当代码在 Web 平台上运行时,您不能首先使用 Platform.X API,否则应用程序将崩溃。相反,您应该使用 kIsWeb 和 TargetPlatform API 来确定运行 Web 浏览器的操作系统,然后,如果您确定不在浏览器中运行,则可以使用 Platform.X API。以下是一些示例:

//  platform.dart

import 'dart:io';

import 'package:flutter/foundation.dart' show TargetPlatform, defaultTargetPlatform, kIsWeb;

bool isDesktop() {
  if (kIsWeb) {
    return (defaultTargetPlatform != TargetPlatform.iOS && defaultTargetPlatform != TargetPlatform.android);
  } else {
    return Platform.isMacOS || Platform.isWindows || Platform.isLinux;
  }
}

bool isMobile() => !isDesktop();

bool isAppleOS() {
  if (kIsWeb) {
    return (defaultTargetPlatform == TargetPlatform.iOS || defaultTargetPlatform == TargetPlatform.macOS);
  } else {
    return Platform.isMacOS || Platform.isIOS;
  }
}

完整回答OP的问题。您必须使用命名条件包导入才能使用正确的存储 API。以下是 Web 会话存储的示例。首先创建一个window_service.dart文件:

//  window_service.dart

Window window = Window();

class Window {
  Map<String, String> sessionStorage = <String, String>{};
}

现在,当不在 Web 上运行时,您可以通过条件导入有条件地使用它,而不是 html.window.sessionStorage:

import 'package:your/path/window_service.dart' if (kIsWeb) 'dart:html';

...

window.sessionStorage[session.masterKey] = state.masterKey();

通过这种方式,您可以在 Web 应用程序中的会话存储和非 Web 应用程序的一些其他自定义存储之间切换。您需要在上面的 window_service.dart 文件中构建它。相同的策略可以应用于 Web localStorage。

这些对我来说是拼图中的几个重要部分,所以我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.