flutter - 从 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'。”
解决方案
由于 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));
推荐阅读
- c# - Unity 中的 NetNamedPipeBinding 支持
- android - 如何从 android 应用程序安装 .cap 小程序?
- aws-lambda - CloudWatch 记录多个自定义指标过滤器以触发 lambda 函数
- java - 如何在休眠中的排序结果中获得第一组结果?
- android - 应该如何为 Firebase 请求构建结构
- node.js - 为什么当视图深度为两层时我的 CSS 不被应用
- c - 通过在c中输入位置来查找字符串的字符
- c# - 将文本作为 guid 插入二进制 (16)
- html - 如何在 angular5/angularitics 中安装单独的 mixpanel 项目以进行开发和生产
- html - 输入类型文本为带斜线的格式化日期