Flutter - 如何将 List<Uint8List> 放入共享首选项中?

Posted

技术标签:

【中文标题】Flutter - 如何将 List<Uint8List> 放入共享首选项中?【英文标题】:Flutter - How to put List<Uint8List> into shared preferences? 【发布时间】:2020-11-11 02:33:01 【问题描述】:

我有一个 Unit8List 列表,其中存储了多个图像的数据。我想与其他活动共享列表,以便其他活动可以使用该列表来显示图像。那么如何使用 SharedPreferences 进行分享?或者有什么方法可以用来传递具有 Unit8List 对象的列表?

【问题讨论】:

你试过我的解决方案了吗? @ChristopherMoore 是的,您的解决方案对我有用,我使用 String s = String.fromCharCodes(inputAsUint8List); 进行编码。我的 unit8list 中有图像数据,它已成功解码并显示图像。谢谢:D 【参考方案1】:

您可以使用以下代码基本上将您的Uint8List“转换”为String,然后可以使用SharePreferences 类的setString 方法轻松地将其存储在SharedPreferences 中:

String s = String.fromCharCodes(inputAsUint8List);

然后转换回来

var outputAsUint8List = Uint8List.fromList(s.codeUnits);

感谢Günter Zöchbauer 进行字符串转换。

或者(如 Richard Heap 建议的那样),您可以使用 base64 对您的数据进行编码

String s = base64.encode(inputAsList);

dart:convert 库中以提高安全性,尽管这会增加您用于存储字符串的空间量。

【讨论】:

如果您的字节数组包含无效的字符代码怎么办?将基于 64 位的字节编码为字符串会更安全。 var s = base64.encode(inputAsList); @RichardHeap 我不相信这是可能的。我进行了测试以确保每个可能的字节都是有效的字符代码,确认它不应该是一个问题。我将此作为一种可能性添加到我的答案中,不管使用 base64 编码会增加需要存储的数据量。 请尝试将以下字节数组 &lt;int&gt;[13] 存储在 android 共享首选项中(使用两种方法),如果您在停止和启动应用程序后得到相同的字节数组,请告诉我。 @RichardHeap 你已经知道结果了吗?还是你真的要我这样做?我所做的测试只是测试fromCharCode 构造函数是否适用于每个可能的字节,以及是否可以检索原始数据。 Android 的共享首选项是否对它可以存储或使用特定类型的编码有限制?这是特定于 Android 还是扩展到 ios 等价物? 我建议你试试看。我相信你会得到一个不正确的结果,因为 Android 会在字符串值进出共享首选项时更改它。如果发生这种情况,它将确认这种不寻常的方法与更正常的 base 64(或十六进制或其他将二进制表示为字符串的方式)相比的脆弱性。【参考方案2】:

我相信 Christopher 提出的另一个答案会为某些二进制值给出不正确的结果,至少在 Android 上是这样。正确的做法是使用标准二进制对可打印字符串进行编码。一个常见的是Base64。

// convert to Base64
var printableString = base64.encode(bytesIn);

// and back
var bytesOut = base64.decode(printableString);

【讨论】:

以上是关于Flutter - 如何将 List<Uint8List> 放入共享首选项中?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 如何更新 List<Map>

Flutter:如何正确地对“列表”进行 JSON 编码?

Flutter:如何将列表传递到 Firestore where 条件

Flutter : List<Document>,如何根据标题去除重复文档

Flutter:我如何从 List<String> 中的 firestore 获取数据?

如何过滤 List<List<Map<String, dynamic>>> 以在 Flutter 中获取值?