Save Blob URL across sessions on Flutter web

144 Views Asked by At

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.

0

There are 0 best solutions below