首页 > 解决方案 > 从 Future 类型的函数返回一个字符串值

问题描述

在 Flutter 中构建应用使用监控应用。尝试使用应用程序名称和在应用程序中花费的时间绘制图表。我有 package_name 一个应用程序,但没有 app_name 本身,所以我使用DeviceApp包来使用 package_name 获取 app_name。

下面的代码是给图表绘制的数据

Future<void> initUsage() async {
    DateTime endDate = new DateTime.now();
    DateTime presentDate = new DateTime.now();
    DateTime startDate = DateTime(presentDate.year,presentDate.month,presentDate.day,0,0,0,1);

    try{
      List<AppUsageInfo> infoList = await AppUsage.getAppUsage(startDate, endDate);
      setState(() {
        _infos = infoList;
        _infos.sort((a,b) => b.usage.inSeconds.compareTo(a.usage.inSeconds));
      });
    } on AppUsageException catch (exception) {print(exception);}
  }




  @override
    build(BuildContext context) {
    
    appNameProvider(pn) async {
      Application apps = await DeviceApps.getApp(pn);
      return apps.appName.toString();
    }

    var data = [
      AppUsagePerDay(appNameProvider(_infos[0].packageName.toString()),_infos[0].usage.inMinutes),
      AppUsagePerDay(_infos[1].appName, _infos[1].usage.inMinutes),
      AppUsagePerDay(_infos[9].appName, _infos[9].usage.inMinutes),
      AppUsagePerDay(_infos[4].appName, _infos[4].usage.inMinutes),
    ];


    var series = [
      charts.Series(
        domainFn: (AppUsagePerDay appData, _) => appData.appName,
        measureFn: (AppUsagePerDay appData, _) => appData.usageTime,
        id: 'Apps',
        data: data,
      ),
    ];

    var chart = charts.BarChart(
      series,
      animate: true,
    );

    var chartWidget = Padding(
      padding: EdgeInsets.all(32.0),
      child: SizedBox(
        height: 350.0,
        child: chart,
      ),
    );

    return Scaffold(
      appBar: AppBar(title: Text("Chart")),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,
          children: <Widget>[chartWidget,
          ],
        ),
      ),
    );
  }
}

那么,如何从Future<string> 类型的函数appNameProvider返回一个字符串。

弹出以下错误“无法将参数类型'Future'分配给参数类型'String'。”

标签: flutter

解决方案


由于 appNameProvider(pn) 的类型为 Future 您需要等待函数完成。像这样使用它

var data=[];
String appName= await appNameProvider(_infos[0].packageName.toString());
data.add( AppUsagePerDay(appName,_infos[0].usage.inMinutes));
appName= await appNameProvider(_infos[1].packageName.toString());
AppUsagePerDay(appName,_infos[1].usage.inMinutes)
data.add( AppUsagePerDay(appName,_infos[1].usage.inMinutes));
appName= await appNameProvider(_infos[2].packageName.toString());
AppUsagePerDay(appName,_infos[2].usage.inMinutes)
data.add( AppUsagePerDay(appName,_infos[2].usage.inMinutes));

推荐阅读