Files
maps_bookmarks/lib/service/json_file_service.dart
2026-01-23 16:41:41 +01:00

78 lines
2.2 KiB
Dart

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 {
try {
final dir = await _directoryPath;
if (dir.isEmpty) return false;
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}');
} catch (e) {
return false;
}
return true;
}
static Future<({List<Collection> collections, List<Bookmark> bookmarks})>
importFromJson() async {
try {
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);
} catch (e) {
return (collections: <Collection>[], bookmarks: <Bookmark>[]);
}
}
static Future<String> get _directoryPath async {
if (Platform.isAndroid) {
return await getDirectoryPath(
initialDirectory: constants.defaultAndroidExportDirectory,
) ??
'';
}
return await getDirectoryPath() ?? '';
}
}