I have an audio data in the form of a Blob URL and want to save it for later sessions. Below are my save/load functions:
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
import 'package:universal_html/html.dart';
Future<void> saveBlobUrl(String blobUrlString, String key) async {
var blobUrl = Uri.parse(blobUrlString);
// 1. get content from the blob url
var response = await http.get(blobUrl);
// 2. encode to base64 string
var rawInput = response.bodyBytes;
var encodedString = base64.encode(rawInput);
// 3. save to pref.
var prefs = await SharedPreferences.getInstance();
prefs.setString(key, encodedString);
}
Future<String> loadAndRecreateBlobUrl(String key) async {
var prefs = await SharedPreferences.getInstance();
// 1. get from prefs
var base64Value = prefs.getString(key);
// 2. decode to string
var rawData = base64.decode(base64Value!);
// 3. create a blob url
var blob = Blob(rawData);
return Url.createObjectUrl(blob);
}
But they don't work as expected as I am verifying by following code snippet:
import 'package:collection/collection.dart';
Future<void> test() async {
// 1. given a data
var orgString = 'fake audio data 12345';
var orgBytes = orgString.codeUnits; //Uint8List.fromList(orgString.codeUnits);
// 2. create a blob url
var blob = Blob(orgBytes);
var blobUrlString = Url.createObjectUrl(blob);
// [SAVE]
var key = "keyToTestSaveAndReload";
await saveBlobUrl(blobUrlString, key);
// [LOAD]
var loadedBlobUrlString = await loadAndRecreateBlobUrl(key);
// 9. get content from blob url
var restoredBytes =
(await http.get(Uri.parse(loadedBlobUrlString))).bodyBytes;
// isEqual
Function eq = const ListEquality().equals;
Function deepEq = const DeepCollectionEquality().equals;
var isEqual = eq(orgBytes, restoredBytes);
var isDeepEq = deepEq(orgBytes, restoredBytes);
logger.d('test: isEqual=$isEqual isDeepEq=$isDeepEq');
logger.d('test: orgString=$orgString');
String restoredString = String.fromCharCodes(restoredBytes);
logger.d('test: restoredString=$restoredString');
String stringFromOrgBytes = String.fromCharCodes(orgBytes);
logger.d('test: stringFromOrgBytes=$stringFromOrgBytes');
}
Does anyone know why the above functions don't work or any existing libraries? Thanks.