You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:23:14