簡體   English   中英

輸入&#39;列表<dynamic> &#39; 不是類型 &#39;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 可以處理它。

  • 只需復制這個方法並給它你的 List ,它就會轉換 &return Unit8List ,它可以在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM