Dart文件调用错误:获取设备信息时报无法调用非函数表达式
问题:使用device_info_plus时触发"The expression doesn't evaluate to a function, so it can't be invoked"错误
在编写device_info.dart获取设备信息时,因原device_info包不兼容Dart 3+,改用device_info_plus后,代码中return deviceInfoPlugin(name, identifier, version)两行触发该错误。原代码如下:
import 'package:device_info/device_info.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import '../domain/model/model.dart'; Future<DeviceInfo> getDeviceDetails() async { String name = "unknown"; String identifier = "unknown"; String version = "unknown"; DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); try { if (defaultTargetPlatform == TargetPlatform.android) { //Android AndroidDeviceInfo androidDeviceInfo = await deviceInfoPlugin.androidInfo; name = "${androidDeviceInfo.brand} ${androidDeviceInfo.model}"; identifier = androidDeviceInfo.id; version = androidDeviceInfo.version.codename; } if (defaultTargetPlatform == TargetPlatform.iOS) { // iOS IosDeviceInfo iosDeviceInfo = await deviceInfoPlugin.iosInfo; name = "${iosDeviceInfo.systemName} ${iosDeviceInfo.model}"; identifier = iosDeviceInfo.identifierForVendor; version = iosDeviceInfo.systemVersion; } } on PlatformException { // return default data error return deviceInfoPlugin(name, identifier, version); } return deviceInfoPlugin(name, identifier, version); }
错误原因
- 对象与构造函数混淆:
deviceInfoPlugin是你创建的DeviceInfoPlugin类的实例对象,不是你定义的DeviceInfo模型类的构造方法,直接用它传参调用会触发函数调用错误。 - 导入包错误:代码里导入的还是旧的
device_info包,而非device_info_plus。 - API调用方式错误:
device_info_plus中获取安卓/iOS设备信息的方法是androidInfo()和iosInfo()(需要加括号调用),而非原代码中的属性访问。
修复步骤
- 替换导入包:将旧的包导入替换为
device_info_plus:import 'package:device_info_plus/device_info_plus.dart'; - 修正API调用:把属性访问改为方法调用:
await deviceInfoPlugin.androidInfo→await deviceInfoPlugin.androidInfo()await deviceInfoPlugin.iosInfo→await deviceInfoPlugin.iosInfo()
- 正确返回模型对象:将
return deviceInfoPlugin(name, identifier, version)替换为DeviceInfo模型类的构造调用(根据你的Model.dart中定义的构造方法调整参数形式,示例为命名参数):return DeviceInfo(name: name, identifier: identifier, version: version);
修复后的完整代码
import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import '../domain/model/model.dart'; Future<DeviceInfo> getDeviceDetails() async { String name = "unknown"; String identifier = "unknown"; String version = "unknown"; final deviceInfoPlugin = DeviceInfoPlugin(); try { if (defaultTargetPlatform == TargetPlatform.android) { final androidDeviceInfo = await deviceInfoPlugin.androidInfo(); name = "${androidDeviceInfo.brand} ${androidDeviceInfo.model}"; identifier = androidDeviceInfo.id; version = androidDeviceInfo.version.codename; } else if (defaultTargetPlatform == TargetPlatform.iOS) { final iosDeviceInfo = await deviceInfoPlugin.iosInfo(); name = "${iosDeviceInfo.systemName} ${iosDeviceInfo.model}"; identifier = iosDeviceInfo.identifierForVendor ?? "unknown"; version = iosDeviceInfo.systemVersion; } } on PlatformException { // 异常时返回默认设备信息 return DeviceInfo(name: name, identifier: identifier, version: version); } return DeviceInfo(name: name, identifier: identifier, version: version); }
内容的提问来源于stack exchange,提问作者Akash Soam
相关产品推荐
相关产品推荐

