我使用了一个名为 device_apps
的 flutter 插件获取安装在我的 android 设备中的应用程序信息。
它返回一个 List<Application>
如果我将对象从应用程序转换为 ApplicationWithIcon
,则提供图标.
但它重新调整的图标是 Uint8 列表类型,我想将它保存在本地并稍后在 Image.memory() 中使用它。
如果我直接使用它而不在本地保存,那么它可以作为 Image.memory(app.icon) 正常工作。但是当我将图标保存在 json 文件中然后使用它时,它会显示错误:
type 'List' is not a subtype of type '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 - 类型 'List<dynamic>' 不是类型“Uint8List”的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64055981/