From 8371a67c1902e09f73cbf86af0dd4fb95996427c Mon Sep 17 00:00:00 2001
From: Sara <sarasdj@stud.ntnu.no>
Date: Thu, 4 Apr 2024 14:49:43 +0200
Subject: [PATCH] update: state initialisation

---
 app/lib/consts.dart                     |  8 ++-
 app/lib/main.dart                       |  5 +-
 app/lib/pages/default_page.dart         | 84 ++++---------------------
 app/lib/pages/loading_page.dart         | 21 ++++---
 app/lib/server_requests/init_state.dart | 36 +++++++++++
 5 files changed, 69 insertions(+), 85 deletions(-)
 create mode 100644 app/lib/server_requests/init_state.dart

diff --git a/app/lib/consts.dart b/app/lib/consts.dart
index 4767d5fb..97d7ba83 100644
--- a/app/lib/consts.dart
+++ b/app/lib/consts.dart
@@ -1,3 +1,5 @@
+import 'dart:typed_data';
+import 'package:app/data_classes.dart';
 import 'package:latlong2/latlong.dart';
 import 'package:flutter/material.dart';
 import 'package:google_fonts/google_fonts.dart';
@@ -9,11 +11,13 @@ const String mapEndpoint = "update_map";
 const int fetchInterval = 60; // Fetch marker data every n minutes
 
 // Map variables
-String selectedLake = 'Mjøsa'; // Initialise to Mjøsa, NB should be initialised to last selected lake
+String selectedLake = 'Mjøsa'; // Init to Mjøsa, NB should be initialised to last selected lake
+Uint8List selectedRelation = Uint8List(0);
+List<Measurement> selectedMarkerList = [];
 LatLng mapCenter = LatLng(60.8000, 10.8471);
 DateTime ?lastUpdate; // Last time data was fetched from server
 
-// Font variables
+// Font settings
 const textColor = Colors.white;
 final appTitleStyle = GoogleFonts.chakraPetch(
   fontSize: 35,
diff --git a/app/lib/main.dart b/app/lib/main.dart
index dcc739fa..b6384264 100644
--- a/app/lib/main.dart
+++ b/app/lib/main.dart
@@ -1,6 +1,7 @@
-import 'pages/default_page.dart';
 import 'package:flutter/material.dart';
 
+import 'pages/loading_page.dart';
+
 void main() {
   runApp(const MyApp());
 }
@@ -11,7 +12,7 @@ class MyApp extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return const MaterialApp(
-      home: DefaultPage(),
+      home: LoadingPage(),
     );
   }
 }
diff --git a/app/lib/pages/default_page.dart b/app/lib/pages/default_page.dart
index 98130863..b87b8029 100644
--- a/app/lib/pages/default_page.dart
+++ b/app/lib/pages/default_page.dart
@@ -1,15 +1,9 @@
 import 'dart:async';
-import 'dart:typed_data';
-import 'package:fuzzy/fuzzy.dart';
 import 'package:flutter/material.dart';
 
 import '../consts.dart';
-import 'loading_page.dart';
 import '../widgets/main_layout.dart';
-import '../data_classes.dart';
 import '../utils/custom_search_delegate.dart';
-import '../server_requests/fetch_markers.dart';
-import '../server_requests/fetch_relation.dart';
 
 class DefaultPage extends StatefulWidget {
   const DefaultPage({Key? key}) : super(key: key);
@@ -23,38 +17,6 @@ class _DefaultPageState extends State<DefaultPage> {
   bool serverConnection = true;
   bool dialogShown = false;
 
-  late Future<List<Measurement>> markerListFuture;
-  late Future<Uint8List> relationFuture;
-
-  @override
-  void initState() {
-    super.initState();
-    // Try to fetch measurement data from server
-    markerListFuture = fetchMeasurements().then((fetchResult) {
-      List<Measurement> measurements = fetchResult.measurements;
-      serverConnection = fetchResult.connected;
-
-      // Return the measurements
-      return measurements;
-    }).catchError((error) {
-      serverConnection = false;
-      throw Exception("Failed to fetch measurements: $error");
-    });
-
-    // Attempt to fetch relation from server if app establishes connection
-    if (serverConnection){
-      relationFuture = fetchRelation();
-    } else { // Read last saved data
-      relationFuture =  loadSavedRelation();
-    }
-
-    // Schedule fetchMarkerData to run periodically based on fetchInterval
-    const Duration interval = Duration(minutes: fetchInterval); // NB fetchInterval value to be determined
-    _timer = Timer.periodic(interval, (timer) {
-      fetchMeasurements();
-    });
-  }
-
   @override
   void dispose() {
     _timer.cancel();
@@ -116,22 +78,6 @@ class _DefaultPageState extends State<DefaultPage> {
                   context: context,
                   delegate: CustomSearchDelegate((String result) {
                     setState(() {
-                      markerListFuture = fetchMeasurements().then((fetchResult) {
-                        List<Measurement> measurements = fetchResult.measurements;
-                        serverConnection = fetchResult.connected;
-
-                        return measurements;
-                      }).catchError((error) {
-                        serverConnection = false;
-                        throw Exception("Failed to fetch measurements: $error");
-                      });
-
-                      if (serverConnection){
-                        relationFuture = fetchRelation();
-                      } else { // Read last saved data
-                        relationFuture =  loadSavedRelation();
-                      }
-
                       selectedLake = result;
                     });
                   }),
@@ -140,25 +86,17 @@ class _DefaultPageState extends State<DefaultPage> {
             ),
           ],
         ),
-        body: FutureBuilder(
-          future: Future.wait([markerListFuture, relationFuture]),
-          builder: (BuildContext context, AsyncSnapshot<List<dynamic>> snapshot) {
-              List<Measurement> markerList = snapshot.data![0] as List<Measurement>;
-              Uint8List relation = snapshot.data![1] as Uint8List;
-
-              return Container( // Return container with list view and background color
-                color: const Color(0xff151515),
-                child: ListView(
-                  children: [
-                    MapContainerWidget(
-                      markerList: markerList,
-                      relation: relation,
-                      serverConnection: serverConnection,
-                    ),
-                  ],
-                ),
-              );
-            }
+        body: Container( // Return container with list view and background color
+          color: const Color(0xff151515),
+          child: ListView(
+            children: [
+              MapContainerWidget(
+                markerList: selectedMarkerList,
+                relation: selectedRelation,
+                serverConnection: serverConnection,
+              ),
+            ],
+          ),
         ),
       ),
     );
diff --git a/app/lib/pages/loading_page.dart b/app/lib/pages/loading_page.dart
index 4952c3fe..79fbee9b 100644
--- a/app/lib/pages/loading_page.dart
+++ b/app/lib/pages/loading_page.dart
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 
 import 'default_page.dart';
+import '../server_requests/init_state.dart';
 
 class LoadingPage extends StatefulWidget {
   const LoadingPage({super.key});
@@ -19,13 +20,17 @@ class _LoadingPageState extends State<LoadingPage>
     // Remove app bar
     SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);
 
-    // Hold loading page for 5 seconds before navigating to the default page
-    Future.delayed(const Duration(seconds: 5), () {
-      Navigator.of(context).pushReplacement(MaterialPageRoute(
-        builder: (_) => const DefaultPage(),
-        )
-      );
-    });
+    // Call initialiseState() asynchronously and wait for it to complete
+    _navigateToDefaultPage();
+  }
+
+  Future<void> _navigateToDefaultPage() async {
+    await initialiseState();
+
+    // Navigate to the default page once state is initialised
+    Navigator.of(context).pushReplacement(MaterialPageRoute(
+      builder: (_) => const DefaultPage(),
+    ));
   }
 
   @override
@@ -52,7 +57,7 @@ class _LoadingPageState extends State<LoadingPage>
         child: Column(
           children: [
             Image.asset(
-              'assets/icons/frozen.png', // Loading screen icon
+              'assets/icons/frozen.png',
               // Icon from: https://www.flaticon.com/free-icons/cold-water"
               color: Colors.grey,
             ),
diff --git a/app/lib/server_requests/init_state.dart b/app/lib/server_requests/init_state.dart
new file mode 100644
index 00000000..b083b463
--- /dev/null
+++ b/app/lib/server_requests/init_state.dart
@@ -0,0 +1,36 @@
+import 'dart:async';
+import 'dart:typed_data';
+import 'package:app/consts.dart';
+
+import '../data_classes.dart';
+import '../server_requests/fetch_markers.dart';
+import '../server_requests/fetch_relation.dart';
+
+Future<void> initialiseState() async{
+  bool serverConnection = true;
+
+  late Future<List<Measurement>> markerListFuture;
+  late Future<Uint8List> relationFuture;
+
+  // Try to fetch measurement data from server
+  markerListFuture = fetchMeasurements().then((fetchResult) {
+    List<Measurement> measurements = fetchResult.measurements;
+    serverConnection = fetchResult.connected;
+
+    // Return the measurements
+    return measurements;
+  }).catchError((error) {
+    serverConnection = false;
+    throw Exception("Failed to fetch measurements: $error");
+  });
+
+  // Attempt to fetch relation from server if app establishes connection
+  if (serverConnection) {
+    relationFuture = fetchRelation();
+  } else { // Read last saved data
+    relationFuture = loadSavedRelation();
+  }
+
+  selectedRelation = await relationFuture;
+  selectedMarkerList = await markerListFuture;
+}
\ No newline at end of file
-- 
GitLab