simple working json import and export
This commit is contained in:
69
lib/service/json_file_service.dart
Normal file
69
lib/service/json_file_service.dart
Normal file
@@ -0,0 +1,69 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:file_selector/file_selector.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
import '../model/bookmark.dart';
|
||||
import '../model/collection.dart';
|
||||
import '../assets/constants.dart' as constants;
|
||||
|
||||
class JsonFileService {
|
||||
static Future<bool> exportToJson({
|
||||
required List<Collection> collections,
|
||||
required List<Bookmark> bookmarks,
|
||||
}) async {
|
||||
final dir = await _directoryPath;
|
||||
|
||||
final data = {
|
||||
'collections': collections.map((c) => c.toJson()).toList(),
|
||||
'bookmarks': bookmarks.map((b) => b.toJson()).toList(),
|
||||
};
|
||||
final json = jsonEncode(data).codeUnits;
|
||||
final file = XFile.fromData(
|
||||
Uint8List.fromList(json),
|
||||
mimeType: 'application/json',
|
||||
name: constants.jsonFileName,
|
||||
);
|
||||
|
||||
file.saveTo('$dir/${constants.jsonFileName}');
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static Future<({List<Collection> collections, List<Bookmark> bookmarks})>
|
||||
importFromJson() async {
|
||||
const typeGroup = XTypeGroup(label: 'json', extensions: <String>['json']);
|
||||
final XFile? file = await openFile(
|
||||
acceptedTypeGroups: <XTypeGroup>[typeGroup],
|
||||
);
|
||||
|
||||
if (file == null) {
|
||||
return (collections: <Collection>[], bookmarks: <Bookmark>[]);
|
||||
}
|
||||
|
||||
final jsonString = await file.readAsString();
|
||||
|
||||
final data = jsonDecode(jsonString) as Map<String, dynamic>;
|
||||
|
||||
final collections = (data['collections'] as List<dynamic>? ?? [])
|
||||
.map((json) => Collection.fromJson(json as Map<String, dynamic>))
|
||||
.toList();
|
||||
|
||||
final bookmarks = (data['bookmarks'] as List<dynamic>? ?? [])
|
||||
.map((json) => Bookmark.fromJson(json as Map<String, dynamic>))
|
||||
.toList();
|
||||
|
||||
return (collections: collections, bookmarks: bookmarks);
|
||||
}
|
||||
|
||||
static Future<String> get _directoryPath async {
|
||||
if (Platform.isAndroid) {
|
||||
return await getDirectoryPath(
|
||||
initialDirectory: constants.defaultAndroidExportDirectory,
|
||||
) ??
|
||||
'';
|
||||
}
|
||||
return await getDirectoryPath() ?? '';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user