feat: change local data interface implementation to singleton

According to our agreed appshell architecture we will make the local implementations
as singletons to represent a single source persistent layer, like a database.

On top of that, the service should be usable across multiple instances of the service, even if no datasource is provided.
This commit is contained in:
Joey Boerwinkel 2024-07-29 11:04:29 +02:00 committed by FlutterJoey
parent 1473ea1a7a
commit 12bde64117
5 changed files with 25 additions and 16 deletions

View file

@ -3,7 +3,6 @@ import "dart:async";
import "package:flutter/material.dart";
import "package:flutter_availability/src/config/availability_translations.dart";
import "package:flutter_availability/src/service/errors.dart";
import "package:flutter_availability/src/service/local_data_interface.dart";
import "package:flutter_availability/src/ui/widgets/defaults/default_base_screen.dart";
import "package:flutter_availability/src/ui/widgets/defaults/default_buttons.dart";
import "package:flutter_availability/src/ui/widgets/defaults/default_confirmation_dialog.dart";

View file

@ -2,6 +2,7 @@
library flutter_availability_data_interface;
export "src/data_interface.dart";
export "src/local_repository/local_data_interface.dart";
export "src/models/availability.dart";
export "src/models/templates.dart";
export "src/service/availability_service.dart";

View file

@ -1,4 +1,3 @@
import "package:flutter/material.dart";
import "package:flutter_availability_data_interface/flutter_availability_data_interface.dart";
/// Returns the default local availabilities for a user
@ -36,18 +35,18 @@ List<AvailabilityModel> getDefaultLocalAvailabilitiesForUser() {
List<AvailabilityTemplateModel> getDefaultLocalTemplatesForUser() {
var currentMonth = DateTime(DateTime.now().year, DateTime.now().month);
return [
for (var template in <(String, String, Color)>[
("1", "Morning", Colors.blue),
("2", "Afternoon", Colors.green),
("3", "Evening", Colors.red),
("4", "Night", Colors.purple),
("5", "All day", Colors.orange),
for (var template in <(String, String, int)>[
("1", "Morning", 0xFF0000FF),
("2", "Afternoon", 0xFF00FF00),
("3", "Evening", 0xFFFF0000),
("4", "Night", 0xFFFF00FF),
("5", "All day", 0xFF9999),
]) ...[
AvailabilityTemplateModel(
id: template.$1,
userId: "",
name: template.$2,
color: template.$3.value,
color: template.$3,
templateType: AvailabilityTemplateType.day,
templateData: DayTemplateData(
startTime: currentMonth,

View file

@ -1,17 +1,26 @@
import "dart:async";
import "package:flutter_availability/src/service/initial_data.dart";
import "package:flutter_availability_data_interface/flutter_availability_data_interface.dart";
import "package:flutter_availability_data_interface/src/local_repository/initial_data.dart";
import "package:rxdart/rxdart.dart";
/// A local implementation of the [AvailabilityDataInterface] that stores data
/// in memory.
class LocalAvailabilityDataInterface implements AvailabilityDataInterface {
/// Creates a representation of the local data interface.
///
LocalAvailabilityDataInterface() {
/// A second call of the constructor will return the same value as earlier
/// calls according to the singleton principle
factory LocalAvailabilityDataInterface() =>
_localDataInterface ??= LocalAvailabilityDataInterface._();
LocalAvailabilityDataInterface._() {
_notifyAvailabilityChanges();
_notifyTemplateChanges();
}
static LocalAvailabilityDataInterface? _localDataInterface;
final Map<String, List<AvailabilityModel>> _userAvailabilities = {
"": getDefaultLocalAvailabilitiesForUser(),
};
@ -21,9 +30,9 @@ class LocalAvailabilityDataInterface implements AvailabilityDataInterface {
};
final StreamController<Map<String, List<AvailabilityModel>>>
_availabilityController = StreamController.broadcast();
_availabilityController = BehaviorSubject();
final StreamController<Map<String, List<AvailabilityTemplateModel>>>
_templateController = StreamController.broadcast();
_templateController = BehaviorSubject();
void _notifyAvailabilityChanges() {
_availabilityController.add(_userAvailabilities);

View file

@ -1,4 +1,5 @@
import "package:flutter_availability_data_interface/src/data_interface.dart";
import "package:flutter_availability_data_interface/src/local_repository/local_data_interface.dart";
import "package:flutter_availability_data_interface/src/models/availability.dart";
import "package:flutter_availability_data_interface/src/models/templates.dart";
import "package:flutter_availability_data_interface/src/utils/public.dart";
@ -7,10 +8,10 @@ import "package:rxdart/rxdart.dart";
///
class AvailabilityService {
///
const AvailabilityService({
AvailabilityService({
required this.userId,
required this.dataInterface,
});
AvailabilityDataInterface? dataInterface,
}) : dataInterface = dataInterface ?? LocalAvailabilityDataInterface();
/// The user id for which the availabilities are managed
final String userId;