improved loading

This commit is contained in:
Myzel394 2022-08-17 10:33:08 +02:00
parent 46b35f2b54
commit 24927627ab
7 changed files with 80 additions and 30 deletions

View File

@ -1,3 +1,4 @@
import 'package:camera/camera.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@ -11,6 +12,7 @@ import 'package:quid_faciam_hodie/screens/server_loading_screen.dart';
import 'package:quid_faciam_hodie/screens/timeline_screen.dart'; import 'package:quid_faciam_hodie/screens/timeline_screen.dart';
import 'package:quid_faciam_hodie/screens/welcome_screen.dart'; import 'package:quid_faciam_hodie/screens/welcome_screen.dart';
import 'managers/global_values_manager.dart';
import 'models/memories.dart'; import 'models/memories.dart';
void main() async { void main() async {
@ -21,6 +23,9 @@ void main() async {
DeviceOrientation.portraitDown, DeviceOrientation.portraitDown,
]); ]);
GlobalValuesManager.setCameras(await availableCameras());
GlobalValuesManager.initializeServer();
runApp(const MyApp()); runApp(const MyApp());
} }

View File

@ -4,6 +4,7 @@ import 'dart:typed_data';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:quid_faciam_hodie/enums.dart'; import 'package:quid_faciam_hodie/enums.dart';
import 'package:quid_faciam_hodie/foreign_types/memory.dart'; import 'package:quid_faciam_hodie/foreign_types/memory.dart';
import 'package:quid_faciam_hodie/managers/global_values_manager.dart';
import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
@ -15,6 +16,8 @@ class FileManager {
static Map<String, Uint8List> fileCache = {}; static Map<String, Uint8List> fileCache = {};
static Future<Memory> getMemoryMetadata(final String id) async { static Future<Memory> getMemoryMetadata(final String id) async {
await GlobalValuesManager.waitForServerInitialization();
final response = await supabase final response = await supabase
.from('memories') .from('memories')
.select() .select()
@ -30,6 +33,8 @@ class FileManager {
} }
static uploadFile(final User user, final File file) async { static uploadFile(final User user, final File file) async {
await GlobalValuesManager.waitForServerInitialization();
final basename = uuid.v4(); final basename = uuid.v4();
final extension = file.path.split('.').last; final extension = file.path.split('.').last;
final filename = '$basename.$extension'; final filename = '$basename.$extension';
@ -106,6 +111,8 @@ class FileManager {
final bool disableDownloadCache = false, final bool disableDownloadCache = false,
final bool disableFileCache = false, final bool disableFileCache = false,
}) async { }) async {
await GlobalValuesManager.waitForServerInitialization();
final tempDirectory = await getTemporaryDirectory(); final tempDirectory = await getTemporaryDirectory();
final filename = '${tempDirectory.path}/$path'; final filename = '${tempDirectory.path}/$path';
final file = File(filename); final file = File(filename);
@ -125,6 +132,8 @@ class FileManager {
} }
static Future<void> deleteFile(final String path) async { static Future<void> deleteFile(final String path) async {
await GlobalValuesManager.waitForServerInitialization();
final response = final response =
await supabase.from('memories').delete().eq('location', path).execute(); await supabase.from('memories').delete().eq('location', path).execute();

View File

@ -1,11 +1,15 @@
import 'package:camera/camera.dart'; import 'package:camera/camera.dart';
import 'package:flutter/foundation.dart';
import 'package:quid_faciam_hodie/constants/apis.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
class GlobalValuesManager { class GlobalValuesManager {
static bool _hasBeenInitialized = false; static Future? _serverInitializationFuture;
static bool _isServerInitialized = false;
static List<CameraDescription> _cameras = []; static List<CameraDescription> _cameras = [];
static List<CameraDescription> get cameras => [..._cameras]; static List<CameraDescription> get cameras => [..._cameras];
static bool get hasBeenInitialized => _hasBeenInitialized; static bool get isServerInitialized => _isServerInitialized;
static void setCameras(List<CameraDescription> cameras) { static void setCameras(List<CameraDescription> cameras) {
if (_cameras.isNotEmpty) { if (_cameras.isNotEmpty) {
@ -15,7 +19,30 @@ class GlobalValuesManager {
_cameras = cameras; _cameras = cameras;
} }
static void setHasBeenInitialized(bool hasBeenInitialized) { static void initializeServer() {
_hasBeenInitialized = hasBeenInitialized; if (_isServerInitialized || _serverInitializationFuture != null) {
return;
}
_serverInitializationFuture = Supabase.initialize(
url: SUPABASE_API_URL,
anonKey: SUPABASE_API_KEY,
debug: kDebugMode,
)..then((_) {
_isServerInitialized = true;
_serverInitializationFuture = null;
});
}
static Future<void> waitForServerInitialization() async {
if (_serverInitializationFuture == null) {
if (_isServerInitialized) {
return;
} else {
throw Exception('Server has not been initialized yet');
}
}
await _serverInitializationFuture;
} }
} }

View File

@ -1,5 +1,6 @@
import 'package:property_change_notifier/property_change_notifier.dart'; import 'package:property_change_notifier/property_change_notifier.dart';
import 'package:quid_faciam_hodie/foreign_types/memory.dart'; import 'package:quid_faciam_hodie/foreign_types/memory.dart';
import 'package:quid_faciam_hodie/managers/global_values_manager.dart';
import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:supabase_flutter/supabase_flutter.dart';
final supabase = Supabase.instance.client; final supabase = Supabase.instance.client;
@ -10,10 +11,10 @@ class Memories extends PropertyChangeNotifier<String> {
Memories(); Memories();
RealtimeSubscription? _serverSubscription; RealtimeSubscription? _serverSubscription;
bool _isInitializing = true; bool _isInitialized = false;
List<Memory> get memories => _memories; List<Memory> get memories => _memories;
bool get isInitializing => _isInitializing; bool get isInitialized => _isInitialized;
@override @override
void dispose() { void dispose() {
@ -42,9 +43,9 @@ class Memories extends PropertyChangeNotifier<String> {
notifyListeners('memories'); notifyListeners('memories');
} }
void setIsInitializing(final bool value) { void setIsInitialized(final bool value) {
_isInitializing = value; _isInitialized = value;
notifyListeners('isInitializing'); notifyListeners('isInitialized');
} }
void sortMemories() { void sortMemories() {
@ -53,11 +54,11 @@ class Memories extends PropertyChangeNotifier<String> {
} }
Future<void> initialize() async { Future<void> initialize() async {
setIsInitializing(true); setIsInitialized(false);
await _loadInitialData(); await _loadInitialData();
setIsInitializing(false); setIsInitialized(true);
notifyListeners(); notifyListeners();
// Watch new updates // Watch new updates
@ -100,6 +101,8 @@ class Memories extends PropertyChangeNotifier<String> {
} }
Future<void> _loadInitialData() async { Future<void> _loadInitialData() async {
await GlobalValuesManager.waitForServerInitialization();
final response = await supabase final response = await supabase
.from('memories') .from('memories')
.select() .select()

View File

@ -62,7 +62,7 @@ class _MainScreenState extends AuthRequiredState<MainScreen> with Loadable {
void initState() { void initState() {
super.initState(); super.initState();
callWithLoading(getLastPhoto); getLastPhoto();
onNewCameraSelected(GlobalValuesManager.cameras[0]); onNewCameraSelected(GlobalValuesManager.cameras[0]);
} }

View File

@ -1,8 +1,6 @@
import 'package:camera/camera.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:quid_faciam_hodie/constants/apis.dart';
import 'package:quid_faciam_hodie/constants/spacing.dart'; import 'package:quid_faciam_hodie/constants/spacing.dart';
import 'package:quid_faciam_hodie/managers/global_values_manager.dart'; import 'package:quid_faciam_hodie/managers/global_values_manager.dart';
import 'package:quid_faciam_hodie/models/memories.dart'; import 'package:quid_faciam_hodie/models/memories.dart';
@ -15,7 +13,12 @@ import 'welcome_screen.dart';
class ServerLoadingScreen extends StatefulWidget { class ServerLoadingScreen extends StatefulWidget {
static const ID = 'server_loading'; static const ID = 'server_loading';
const ServerLoadingScreen({Key? key}) : super(key: key); final String? nextScreen;
const ServerLoadingScreen({
Key? key,
this.nextScreen,
}) : super(key: key);
@override @override
State<ServerLoadingScreen> createState() => _ServerLoadingScreenState(); State<ServerLoadingScreen> createState() => _ServerLoadingScreenState();
@ -30,25 +33,20 @@ class _ServerLoadingScreenState extends State<ServerLoadingScreen> {
} }
Future<void> load() async { Future<void> load() async {
if (!GlobalValuesManager.hasBeenInitialized) { await GlobalValuesManager.waitForServerInitialization();
GlobalValuesManager.setCameras(await availableCameras());
await Supabase.initialize(
url: SUPABASE_API_URL,
anonKey: SUPABASE_API_KEY,
debug: kDebugMode,
);
GlobalValuesManager.setHasBeenInitialized(true);
}
final memories = context.read<Memories>(); final memories = context.read<Memories>();
final session = Supabase.instance.client.auth.session(); final session = Supabase.instance.client.auth.session();
if (session != null) { if (session != null) {
memories.initialize().then((_) { if (!memories.isInitialized) {
Navigator.pushReplacementNamed(context, MainScreen.ID); await memories.initialize();
}); }
Navigator.pushReplacementNamed(
context,
widget.nextScreen ?? MainScreen.ID,
);
} else { } else {
Navigator.pushReplacementNamed(context, WelcomeScreen.ID); Navigator.pushReplacementNamed(context, WelcomeScreen.ID);
} }

View File

@ -3,6 +3,7 @@ import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:quid_faciam_hodie/constants/spacing.dart'; import 'package:quid_faciam_hodie/constants/spacing.dart';
import 'package:quid_faciam_hodie/enums.dart'; import 'package:quid_faciam_hodie/enums.dart';
import 'package:quid_faciam_hodie/screens/server_loading_screen.dart';
import 'package:quid_faciam_hodie/screens/timeline_screen.dart'; import 'package:quid_faciam_hodie/screens/timeline_screen.dart';
import 'raw_memory_display.dart'; import 'raw_memory_display.dart';
@ -27,7 +28,14 @@ class TodayPhotoButton extends StatelessWidget {
onTap: () async { onTap: () async {
onLeave(); onLeave();
await Navigator.pushNamed(context, TimelineScreen.ID); await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ServerLoadingScreen(
nextScreen: TimelineScreen.ID,
),
),
);
onComeBack(); onComeBack();
}, },