来自数据库的 Flutter Uint8list 字符串呈现为图像
Posted
技术标签:
【中文标题】来自数据库的 Flutter Uint8list 字符串呈现为图像【英文标题】:Flutter Uint8list string from database render as Image 【发布时间】:2020-07-09 14:54:24 【问题描述】:场景:
我有一个签名板,它的点(列表)保存到 SQL 服务器。 我从数据库中获取它并将其显示到另一个屏幕上。Flutter 保存代码
我只会提供我认为相关的重要代码。
// This is save button
onPressed()
data =
'Signature' : _fbKey.currentState.value['signature'].toString()
// trigger _save function
if (_fbKey.currentState.saveAndValidate())
_save(data);
// _save function
_save(data) async
final response = await http.post('url here..', body: data);
Laravel 代码 我将提供我也认为相关的代码
Route::middleware('admin')->post('link...', function (Request $request)
$user = new User;
$user->Signature= $request->Signature;
$user->save();
return response()->json([
'message' => 'Success',
'data' => $user
], 200);
);
Flutter 获取代码
getData() async
final response = await http.get('url goes here');
var signRes = jsonDecode(response.body);
String rawSign = signRes['data']['Signature'];
print(rawSign); // output [137, ....so on]
List<int> list = rawSign.codeUnits;
print(list); // the output that I expected suddenly change to [91, ..... so on]
Uint8List signature = Uint8List.fromList(list);
@override
Widget build(BuildContext context)
return Scaffold(
.......
.......
child: Container(
child: Image.memory(signature);
)
)
SQL 服务器
column : Signature
datatype: nvarchar(max)
我得到的异常:
无法实例化图像编解码器
问题
如您所见,我从签名板获得的点(列表)是合法的点(列表),但我在保存时将其转换为toString()
,因为 Flutter
抛出异常说不能转换 Uint8Arrat to String
。那么,是否可以从数据库中获取 Stringed List points 而不将其转换为 .codeUnits
?因为这样做时,value changes from what expected
.
【问题讨论】:
【参考方案1】:感谢the other SO question.,我终于让它工作了
基本上,我先将数据转换为 base64,然后再保存到数据库中。
data =
'Signature' : base64Encode(_fbKey.currentState.value['signature'])
然后将其转换回原来的形式
var signRes = jsonDecode(response.body);
String rawSign = signRes['data']['Signature'];
Uint8List signature = base64Decode(rawSign);
最后,繁荣。图像按预期成功呈现在应用程序中。
【讨论】:
以上是关于来自数据库的 Flutter Uint8list 字符串呈现为图像的主要内容,如果未能解决你的问题,请参考以下文章
从 Flutter 中的 Uint8List 数据更改图像大小
Flutter - 如何将 List<Uint8List> 放入共享首选项中?