![](/img/trans.png)
[英]Flutter: type 'Future<dynamic>' is not a subtype of type 'Uint8List'
[英]type 'List<dynamic>' is not a subtype of type 'Uint8List
我正在使用名為device_apps
的 flutter 插件來獲取安裝在我的 android 設備中的應用程序信息。
如果我將 Object 從 Application 轉換為ApplicationWithIcon
它會返回一個List<Application>
,它提供圖標。
但是它返回的圖標是 Uint8 List 類型,我想將它保存在本地並稍后在 Image.memory() 中使用它。
如果我直接使用它而不在本地保存,那么它作為 Image.memory(app.icon) 可以正常工作。但是當我將圖標保存在 json 文件中然后使用它時,它會顯示錯誤:
“List”類型不是“Uint8List”類型的子類型
如何將其保存在本地然后使用?
import 'dart:async';
import 'dart:convert';
import 'dart:ffi';
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:device_apps/device_apps.dart';
import 'package:app_settings/app_settings.dart';
import 'package:flutter/services.dart' show rootBundle;
void main() {
runApp(
MaterialApp(
title: 'Reading and Writing Files',
home: MyApp(),
),
);
}
const String dataFile = 'data1.json';
class MyApp extends StatefulWidget {
@override
_AppState createState() => _AppState();
}
class _AppState extends State<MyApp> {
String data;
File _filePath;
bool _fileExists = false;
String jsonString;
List<dynamic> _json = [];
List<dynamic> _jsonshow = [];
List<Application> appsDetail;
void checkFile() async {
// chek if file exists
String dir = (await getApplicationDocumentsDirectory()).path;
String savePath = '$dir/$dataFile';
//for a directory: await Directory(savePath).exists();
if (await File(savePath).exists()) {
print("File exists");
} else {
print("File don't exists");
}
}
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
print(directory.path);
return directory.path;
}
Future<File> get _localFile async {
final path = await _localPath;
return File('$path/$dataFile');
}
void appDetail() async {
print("Getting app informations using 'device_apps' : ");
List<Application> apps = await DeviceApps.getInstalledApplications(
includeSystemApps: true,
includeAppIcons: true,
onlyAppsWithLaunchIntent: true,
);
print("Printing apps detail from appDetail() Funtion apps : ");
// for (int i = 0; i < apps.length; i++) print(apps[i]);
print(apps);
appsDetail = apps;
for (int i = 0; i < apps.length; i++) {
ApplicationWithIcon icon = apps[i] as ApplicationWithIcon;
print(icon.icon.runtimeType);
// print(apps[i]);
_json.add({
"totalApps": apps.length,
"appName": apps[i].appName,
"apkFilePath": apps[i].apkFilePath,
"packageName": apps[i].packageName,
"versionName": apps[i].versionName,
"versionCode": apps[i].versionCode,
"dataDir": apps[i].dataDir,
"systemApp": apps[i].systemApp,
"installTimeMillis": apps[i].installTimeMillis,
"updateTimeMillis": apps[i].updateTimeMillis,
"icon": icon.icon,
// "category": apps[i].category
});
}
print(_json);
}
void writeJsonfile() async {
print("Writing json file : ");
_filePath = await _localFile;
print("json before encoding : ");
print("$_json");
jsonString = jsonEncode(_json);
print("jsonString after encoding : ");
print(jsonString);
_filePath.writeAsString(
jsonEncode(jsonString),
);
}
Future<List<Object>> Apps() async {
print("Reading Json file");
_filePath = await _localFile;
_fileExists = await _filePath.exists();
print('0. File exists? $_fileExists');
if (_fileExists) {
try {
String jsonString = await _filePath.readAsString();
_json = jsonDecode(jsonString);
print('printing json file after reading : ');
print(_json);
return _json;
} catch (e) {
// Print exception errors
print('Tried reading _file error: $e');
// If encountering an error, return null
}
} else {}
}
@override
void initState() {
super.initState();
appDetail();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Reading and Writing data')),
body: Column(
children: <Widget>[
IconButton(icon: Icon(Icons.ac_unit), onPressed: Apps),
_json.length >= 1
? GridView.builder(
shrinkWrap: true,
physics: ScrollPhysics(),
scrollDirection: Axis.vertical,
itemCount: _json.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 5, childAspectRatio: 2.0),
itemBuilder: (BuildContext context, int index) {
return Column(
children: <Widget>[
Expanded(child: Text(_json[index]["appName"])),
Expanded(child: Image.memory(_json[index]["icon"])),
],
);
})
: Text("No Data Found"),
],
));
}
}
我找到了一個愚蠢的解決方案,但我不知道為什么會這樣!
只需將_json[index]['icon']
插入一個變量,然后在 Image.memory() 中使用它,就是這樣。
var icon = `_json[index]['icon']` ;
Image.memory(icon)
這是完整的代碼:
import 'dart:async';
import 'dart:convert';
import 'dart:ffi';
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:device_apps/device_apps.dart';
import 'package:app_settings/app_settings.dart';
import 'package:flutter/services.dart' show rootBundle;
void main() {
runApp(
MaterialApp(
title: 'Reading and Writing Files',
home: MyApp(),
),
);
}
const String dataFile = 'data1.json';
class MyApp extends StatefulWidget {
@override
_AppState createState() => _AppState();
}
class _AppState extends State<MyApp> {
String data;
File _filePath;
bool _fileExists = false;
String jsonString;
List<dynamic> _json = [];
List<dynamic> _jsonshow = [];
List<Application> appsDetail;
void checkFile() async {
// chek if file exists
String dir = (await getApplicationDocumentsDirectory()).path;
String savePath = '$dir/$dataFile';
//for a directory: await Directory(savePath).exists();
if (await File(savePath).exists()) {
print("File exists");
} else {
print("File don't exists");
}
}
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
print(directory.path);
return directory.path;
}
Future<File> get _localFile async {
final path = await _localPath;
return File('$path/$dataFile');
}
void appDetail() async {
print("Getting app informations using 'device_apps' : ");
List<Application> apps = await DeviceApps.getInstalledApplications(
includeSystemApps: true,
includeAppIcons: true,
onlyAppsWithLaunchIntent: true,
);
print("Printing apps detail from appDetail() Funtion apps : ");
// for (int i = 0; i < apps.length; i++) print(apps[i]);
print(apps);
appsDetail = apps;
for (int i = 0; i < apps.length; i++) {
ApplicationWithIcon icon = apps[i] as ApplicationWithIcon;
print(icon.icon.runtimeType);
// print(apps[i]);
_json.add({
"totalApps": apps.length,
"appName": apps[i].appName,
"apkFilePath": apps[i].apkFilePath,
"packageName": apps[i].packageName,
"versionName": apps[i].versionName,
"versionCode": apps[i].versionCode,
"dataDir": apps[i].dataDir,
"systemApp": apps[i].systemApp,
"installTimeMillis": apps[i].installTimeMillis,
"updateTimeMillis": apps[i].updateTimeMillis,
"icon": icon.icon,
// "category": apps[i].category
});
}
print(_json);
}
void writeJsonfile() async {
print("Writing json file : ");
_filePath = await _localFile;
print("json before encoding : ");
print("$_json");
jsonString = jsonEncode(_json);
print("jsonString after encoding : ");
print(jsonString);
_filePath.writeAsString(
jsonEncode(jsonString),
);
}
Future<List<Object>> Apps() async {
print("Reading Json file");
_filePath = await _localFile;
_fileExists = await _filePath.exists();
print('0. File exists? $_fileExists');
if (_fileExists) {
try {
String jsonString = await _filePath.readAsString();
_json = jsonDecode(jsonString);
print('printing json file after reading : ');
print(_json);
return _json;
} catch (e) {
// Print exception errors
print('Tried reading _file error: $e');
// If encountering an error, return null
}
} else {}
}
@override
void initState() {
super.initState();
appDetail();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Reading and Writing data')),
body: Column(
children: <Widget>[
IconButton(icon: Icon(Icons.ac_unit), onPressed: Apps),
_json.length >= 1
? GridView.builder(
shrinkWrap: true,
physics: ScrollPhysics(),
scrollDirection: Axis.vertical,
itemCount: _json.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 5, childAspectRatio: 2.0),
itemBuilder: (BuildContext context, int index) {
print("Checking");
print(_json[index]["icon"].runtimeType);
var icon = _json[index]["icon"];
return Column(
children: <Widget>[
Expanded(child: Text(_json[index]["appName"])),
Expanded(child: Image.memory(icon)),
],
);
})
: Text("No Data Found"),
],
));
}
}
我在將圖像從本機模塊(Android)傳遞到 Flutter 時遇到了同樣的問題。 (我在做一個插件)
默認情況下,Flutter 會處理來自底層平台的數據類型並將其映射到 Dart 中的正確數據類型,請在此處查看此表以查看數據類型。 但在我的情況下,Flutter 將byte[]
類型的值截取為List<dynamic>
所以只需將它從List<dynamic>
為List<Int>
,Flutter 可以處理它。
image.memory()
。
Uint8List _getImageBinary(dynamicList) {
List<int> intList = dynamicList.cast<int>().toList(); //This is the magical line.
Uint8List data = Uint8List.fromList(intList);
return data;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.