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

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);
}

错误原因

  1. 对象与构造函数混淆:deviceInfoPlugin是你创建的DeviceInfoPlugin类的实例对象,不是你定义的DeviceInfo模型类的构造方法,直接用它传参调用会触发函数调用错误。
  2. 导入包错误:代码里导入的还是旧的device_info包,而非device_info_plus。
  3. API调用方式错误:device_info_plus中获取安卓/iOS设备信息的方法是androidInfo()和iosInfo()(需要加括号调用),而非原代码中的属性访问。

修复步骤

  1. 替换导入包:将旧的包导入替换为device_info_plus:
    import 'package:device_info_plus/device_info_plus.dart';
    
  2. 修正API调用:把属性访问改为方法调用:
    • await deviceInfoPlugin.androidInfo → await deviceInfoPlugin.androidInfo()
    • await deviceInfoPlugin.iosInfo → await deviceInfoPlugin.iosInfo()
  3. 正确返回模型对象:将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:05:05