I am using the GitHub API to fetch the README of my repository. The content of the README comes encoded in base64. When I try to decode it in Flutter/Dart, I encounter a FormatException: Invalid character error. Here is the error message:
Unhandled exception:
FormatException: Invalid character (at character 61)
PGRpdiBhbGlnbj0iY2VudGVyIj4KCiMgTmFtYXN0ZSDwn5mPLCBJJ20gRGVl
^
#0 _Base64Decoder.decodeChunk (dart:convert/base64.dart:705:7)
#1 _Base64Decoder.decode (dart:convert/base64.dart:629:14)
#2 Base64Decoder.convert (dart:convert/base64.dart:509:26)
#3 Base64Codec.decode (dart:convert/base64.dart:83:47)
#4 main (file:///home/deepesh/Development/public/learn/flutter-dart/git_search_flutter/learn.dart:6:24)
#5 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297:19)
#6 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
Then I read some stack overflow comment that it is strick encoding, i was finding the how strick encoding work on dart it was nothing, i can found it.
import 'dart:convert';
const content =
"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n";
void main() {
var decoder = base64.decode(content);
print(decoder);
}
here content is my readme file in base64 encoding claim by github api response
https://api.github.com/repos/DeepeshKalura/DeepeshKalura/readme
endpoint, i guess it is public so, no issue you will get same result
Currently, i am manaing with the exception handling
import 'dart:convert';
late String markdown;
Future<String> markdownFunction() async {
var profileMarkdown = await profileRenderKernaHai();
var bodyMarkdown = profileMarkdown?.content;
if (bodyMarkdown == null) {
return "No Markdown";
} else {
// Log the base64 string for debugging
print('Base64 String: $bodyMarkdown');
// Sanitize the input by removing any extraneous whitespace
bodyMarkdown = bodyMarkdown.replaceAll(RegExp(r's+'), '');
// Ensure proper padding
while (bodyMarkdown!.length % 4 != 0) {
bodyMarkdown += '=';
}
try {
var decoded = base64.decode(bodyMarkdown);
return utf8.decode(decoded);
} catch (e) {
// Handle the error or log it
print('Error decoding base64 string: $e');
return "Error: Invalid Markdown";
}
}
}
Excepted result an readme file, just like here.
https://raw.githubusercontent.com/DeepeshKalura/DeepeshKalura/main/README.md