Flutter获取设备User Agent报错:BaseDeviceInfo无法转为WebBrowserInfo
解决Flutter获取User Agent的类型转换异常及替代方案
一、修复device_info_plus的类型转换问题
你遇到的BaseDeviceInfo转WebBrowserInfo错误,核心原因是webBrowserInfo仅支持Web平台,在Android、iOS等移动端调用时,返回的是对应平台的设备信息对象(比如AndroidDeviceInfo、IosDeviceInfo),直接强转就会触发类型不匹配错误。
修复方案1:按平台分支处理
通过平台判断,针对不同环境执行对应逻辑:
import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:device_info_plus/device_info_plus.dart'; String _userAgent = ''; Future<void> _getDeviceInfo() async { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); if (kIsWeb) { // Web平台直接获取浏览器User Agent final webInfo = await deviceInfo.webBrowserInfo; _userAgent = webInfo.userAgent ?? ''; } else { // 移动端拼接自定义User Agent(或根据需求调整格式) if (Platform.isAndroid) { final androidInfo = await deviceInfo.androidInfo; _userAgent = 'Mozilla/5.0 (Linux; Android ${androidInfo.version.release}; ${androidInfo.model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36'; } else if (Platform.isIOS) { final iosInfo = await deviceInfo.iosInfo; _userAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS ${iosInfo.systemVersion} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Mobile/15E148 Safari/604.1'; } } }
修复方案2:类型安全检查
不依赖平台判断,直接通过类型校验处理:
import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; String _userAgent = ''; Future<void> _getDeviceInfo() async { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); final info = await deviceInfo.webBrowserInfo; if (info is WebBrowserInfo) { _userAgent = info.userAgent ?? ''; } else { // 非Web平台逻辑 if (Platform.isAndroid) { final androidInfo = await deviceInfo.androidInfo; _userAgent = 'Android/${androidInfo.version.release} ${androidInfo.model}'; } else if (Platform.isIOS) { final iosInfo = await deviceInfo.iosInfo; _userAgent = 'iOS/${iosInfo.systemVersion} ${iosInfo.name}'; } } }
二、不使用device_info_plus的替代方案
1. Web平台原生获取
直接调用Web API获取浏览器原生User Agent:
import 'dart:html' as html; String getWebUserAgent() { return html.window.navigator.userAgent ?? ''; }
2. 移动端自定义/自动携带
- 如果你用
HttpClient或Dio发送请求,移动端系统默认的User Agent会自动携带在请求头中,无需手动获取 - 若需自定义,可结合
package_info_plus拼接应用相关信息:
import 'package:package_info_plus/package_info_plus.dart'; import 'dart:io'; Future<String> getCustomUserAgent() async { final packageInfo = await PackageInfo.fromPackageInfo(); final appName = packageInfo.appName; final version = packageInfo.version; if (Platform.isAndroid) { return '$appName/$version (Android; ${Platform.operatingSystemVersion})'; } else if (Platform.isIOS) { return '$appName/$version (iPhone; iOS ${Platform.operatingSystemVersion})'; } else { return '$appName/$version'; } }
3. 跨平台通用方案
无需依赖任何第三方包,直接按平台返回预设格式的User Agent:
import 'dart:io'; import 'package:flutter/foundation.dart'; import 'dart:html' as html; String getDefaultUserAgent() { if (kIsWeb) { return html.window.navigator.userAgent ?? 'Mozilla/5.0 (Unknown; Web)'; } else if (Platform.isAndroid) { return 'Mozilla/5.0 (Linux; Android ${Platform.operatingSystemVersion}) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36'; } else if (Platform.isIOS) { return 'Mozilla/5.0 (iPhone; CPU iPhone OS ${Platform.operatingSystemVersion} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148'; } else { return 'Mozilla/5.0 (Unknown Platform)'; } }
内容的提问来源于stack exchange,提问作者SultanKingGD
相关产品推荐
相关产品推荐

