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 编码会增加需要存储的数据量。
请尝试将以下字节数组 <int>[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:如何将列表传递到 Firestore where 条件
Flutter : List<Document>,如何根据标题去除重复文档