我正在开发一个项目,该项目既可以作为应用程序也可以作为网页使用。我正在使用 flutter_secure_storage 来存储应用程序的本地数据,但我需要一种不同的网络方法。 有没有办法让我在运行时知道我所在的平台,并相应地选择正确的读写函数?
您可以将此扩展文件添加到项目中并调用任何对象
目标.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");
}
对于网络,您使用:
if(kIsWeb) //returns a boolean if your app is running in a browser.
对于其他平台,您使用
Platform
Platform.isAndroid
Platform.isIos
Platform.isLinux
在调用
Platform.is
之前,请务必先检查您是否在网络上运行,因为它会抛出一个异常,表明平台不适用于此环境。
如何检测 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');
}
为了检测 Flutter 是否是为 Web 编译的,您可以使用包中的 kIsWeb
import 'package:flutter/foundation.dart'
。对于 Android、IOS、Windows、Mac 等其他环境,您可以使用 Platform class like
Platform.IsWindows
我认为这个问题没有得到正确的回答。因此,对于像我一样发现自己在这里的任何人......当代码在 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。
这些对我来说是拼图中的几个重要部分,所以我希望这会有所帮助。