diff --git a/lib/extensions/obtainProviderExtension.dart b/lib/extensions/obtainProviderExtension.dart new file mode 100644 index 0000000..04284bf --- /dev/null +++ b/lib/extensions/obtainProviderExtension.dart @@ -0,0 +1,8 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +extension ObtainProviderExtension on BuildContext { + T obtainState<T extends ChangeNotifier>() { + return Provider.of<T>(this, listen: false); + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 81aadc9..18614f9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,16 +1,24 @@ +import 'package:app/state/legalStatusState.dart'; +import 'package:app/state/mapState.dart'; import 'package:app/view/home.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; void main() { runApp( - const MyApp(), + MultiProvider( + providers: [ + ChangeNotifierProvider<LegalStatusState>(create: (context) => LegalStatusState()), + ChangeNotifierProvider<MapState>(create: (context) => MapState()), + ], + builder: (context, child) => const MyApp(), + ) ); } class MyApp extends StatelessWidget { const MyApp({super.key}); - // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( diff --git a/lib/model/legelState.dart b/lib/model/legelState.dart new file mode 100644 index 0000000..3725939 --- /dev/null +++ b/lib/model/legelState.dart @@ -0,0 +1,6 @@ +enum LegalState { + unknown, + allowed, + disallowedTime, + disallowedRegion +} \ No newline at end of file diff --git a/lib/state/legalStatusState.dart b/lib/state/legalStatusState.dart new file mode 100644 index 0000000..2d0eb30 --- /dev/null +++ b/lib/state/legalStatusState.dart @@ -0,0 +1,18 @@ +import 'package:app/model/legelState.dart'; +import 'package:flutter/cupertino.dart'; + +class LegalStatusState extends ChangeNotifier { + LegalState _legalState = LegalState.unknown; + + LegalState get getLegalState => _legalState; + + set setInSightOfDisallowedAreas(bool isInSight) { + _legalState = LegalState.disallowedRegion; + notifyListeners(); + } + + set setIsInDisallowedTimeRanges(bool isInDisallowedTime) { + _legalState = LegalState.disallowedTime; + notifyListeners(); + } +} \ No newline at end of file diff --git a/lib/state/mapState.dart b/lib/state/mapState.dart new file mode 100644 index 0000000..510c19a --- /dev/null +++ b/lib/state/mapState.dart @@ -0,0 +1,12 @@ +import 'package:flutter/cupertino.dart'; + +class MapState extends ChangeNotifier { + bool _isLocationLock = false; + + bool get followLocation => _isLocationLock; + + toggleLocationLock() { + _isLocationLock = !_isLocationLock; + notifyListeners(); + } +} \ No newline at end of file diff --git a/lib/view/home.dart b/lib/view/home.dart index c58df7b..3fbf7d5 100644 --- a/lib/view/home.dart +++ b/lib/view/home.dart @@ -1,5 +1,9 @@ +import 'package:app/extensions/obtainProviderExtension.dart'; +import 'package:app/state/mapState.dart'; +import 'package:app/view/legalStatus.dart'; import 'package:app/view/map.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class HomeView extends StatefulWidget { const HomeView({super.key}); @@ -18,12 +22,20 @@ class _HomePageState extends State<HomeView> { actions: [], ), floatingActionButton: FloatingActionButton( - child: const Icon(Icons.my_location), - onPressed: () { - - }, + child: Consumer<MapState>(builder: (context, value, child) => Icon(value.followLocation ? Icons.my_location : Icons.location_disabled)), + onPressed: () => context.obtainState<MapState>().toggleLocationLock(), + ), + body: const Column( + children: [ + SizedBox( + height: 100, + child: LegalStatusView(), + ), + Expanded( + child: MapView(), + ) + ], ), - body: MapView(), ); } } diff --git a/lib/view/legalStatus.dart b/lib/view/legalStatus.dart new file mode 100644 index 0000000..1dfbdd8 --- /dev/null +++ b/lib/view/legalStatus.dart @@ -0,0 +1,21 @@ +import 'package:app/state/legalStatusState.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class LegalStatusView extends StatefulWidget { + const LegalStatusView({super.key}); + + @override + State<LegalStatusView> createState() => _LegalStatusViewState(); +} + +class _LegalStatusViewState extends State<LegalStatusView> { + @override + Widget build(BuildContext context) { + return Consumer<LegalStatusState>( + builder: (context, value, child) { + return Placeholder(); + }, + ); + } +} diff --git a/lib/view/status.dart b/lib/view/status.dart new file mode 100644 index 0000000..a2b330b --- /dev/null +++ b/lib/view/status.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class StatusView extends StatefulWidget { + const StatusView({super.key}); + + @override + State<StatusView> createState() => _StatusViewState(); +} + +class _StatusViewState extends State<StatusView> { + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} diff --git a/pubspec.lock b/pubspec.lock index d81b370..aea0151 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + ansicolor: + dependency: transitive + description: + name: ansicolor + sha256: "8bf17a8ff6ea17499e40a2d2542c2f481cd7615760c6d34065cb22bfd22e6880" + url: "https://pub.dev" + source: hosted + version: "2.0.2" archive: dependency: transitive description: @@ -89,6 +97,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + csslib: + dependency: transitive + description: + name: csslib + sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + url: "https://pub.dev" + source: hosted + version: "1.0.0" cupertino_icons: dependency: "direct main" description: @@ -126,11 +142,32 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.1" + flutter_native_splash: + dependency: "direct main" + description: + name: flutter_native_splash + sha256: edf39bcf4d74aca1eb2c1e43c3e445fd9f494013df7f0da752fefe72020eedc0 + url: "https://pub.dev" + source: hosted + version: "2.4.0" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + html: + dependency: transitive + description: + name: html + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + url: "https://pub.dev" + source: hosted + version: "0.15.4" image: dependency: transitive description: @@ -312,6 +349,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.2" + universal_io: + dependency: transitive + description: + name: universal_io + sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + url: "https://pub.dev" + source: hosted + version: "2.2.2" vector_math: dependency: transitive description: @@ -346,4 +391,4 @@ packages: version: "3.1.2" sdks: dart: ">=3.3.2 <4.0.0" - flutter: ">=1.16.0" + flutter: ">=2.5.0"