Location now working with map

This commit is contained in:
mikes222 2025-08-16 14:46:06 +02:00
parent 75724e4043
commit 4a7b426729
7 changed files with 1800 additions and 61 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,12 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:location/location.dart';
import 'package:wien_talks_flutter/get_location_widget.dart'; import 'package:wien_talks_flutter/get_location_widget.dart';
import 'package:wien_talks_flutter/mapfile_widget.dart';
import 'package:wien_talks_flutter/news_input_form.dart'; import 'package:wien_talks_flutter/news_input_form.dart';
import 'package:wien_talks_flutter/widgets/screen_widget.dart'; import 'package:wien_talks_flutter/widgets/screen_widget.dart';
import 'location_mgr.dart';
class CreateEventScreen extends StatelessWidget { class CreateEventScreen extends StatelessWidget {
const CreateEventScreen({super.key}); const CreateEventScreen({super.key});
@ -11,9 +15,13 @@ class CreateEventScreen extends StatelessWidget {
return ScreenWidget( return ScreenWidget(
child: Column( child: Column(
children: [ children: [
Text("hello"),
GetLocationWidget(),
NewsInputForm(onSubmit: (newsEventModel) {}), NewsInputForm(onSubmit: (newsEventModel) {}),
StreamBuilder(stream: LocationMgr().stream, builder: (BuildContext context, AsyncSnapshot<LocationData> snapshot) => Text(snapshot.data.toString())),
Expanded(
child: GetLocationWidget(
child: MapfileWidget(),
),
),
], ],
)); ));
} }

View file

@ -1,38 +1,42 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:location/location.dart';
import 'package:wien_talks_flutter/location_mgr.dart'; import 'package:wien_talks_flutter/location_mgr.dart';
class GetLocationWidget extends StatelessWidget { class GetLocationWidget extends StatefulWidget {
const GetLocationWidget({super.key}); final Widget child;
const GetLocationWidget({super.key, required this.child});
@override
State<GetLocationWidget> createState() => _GetLocationWidgetState();
}
class _GetLocationWidgetState extends State<GetLocationWidget> {
@override
void dispose() {
LocationMgr().shutdown();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return FutureBuilder(
children: [ future: LocationMgr().startup(),
FutureBuilder( builder: (BuildContext context, AsyncSnapshot<String?> snapshot) {
future: LocationMgr().startup(), switch (snapshot.connectionState) {
builder: (BuildContext context, AsyncSnapshot<String?> snapshot) { case ConnectionState.none:
switch (snapshot.connectionState) { case ConnectionState.waiting:
case ConnectionState.waiting: return CircularProgressIndicator();
return CircularProgressIndicator(); case ConnectionState.active:
case ConnectionState.done: case ConnectionState.done:
{ {
if (snapshot.hasData) { if (snapshot.hasData) {
// Error occured // Error occured
return Text(snapshot.data.toString()); return Text(snapshot.data.toString(), style: TextStyle(color: Colors.red));
} else { } else {
return Text("No data -> OK"); return widget.child;
} }
}
default:
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
}
return Text("OK");
} }
}), }
StreamBuilder(stream: LocationMgr().stream, builder: (BuildContext context, AsyncSnapshot<LocationData> snapshot) => Text(snapshot.data.toString())), });
],
);
} }
} }

View file

@ -1,10 +1,14 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart';
import 'package:location/location.dart'; import 'package:location/location.dart';
import 'package:mapsforge_flutter/core.dart';
import 'package:mapsforge_flutter/maps.dart';
import 'package:mapsforge_flutter/marker.dart';
import 'package:rxdart/rxdart.dart'; import 'package:rxdart/rxdart.dart';
class LocationMgr { class LocationMgr {
Location location = Location(); final Location location = Location();
bool serviceEnabled = false; bool serviceEnabled = false;
@ -16,14 +20,35 @@ class LocationMgr {
final Subject<LocationData> _subject = PublishSubject<LocationData>(); final Subject<LocationData> _subject = PublishSubject<LocationData>();
final TileBitmapCache bitmapCache = MemoryTileBitmapCache.create();
StreamSubscription? _subscription; StreamSubscription? _subscription;
ViewModel? viewModel;
late MapModel mapModel;
IconMarker? iconMarker;
final DisplayModel displayModel = DisplayModel(maxZoomLevel: 20);
final SymbolCache symbolCache = FileSymbolCache();
final JobRenderer jobRenderer = MapOnlineRenderer();
factory LocationMgr() { factory LocationMgr() {
_instance ??= LocationMgr._(); _instance ??= LocationMgr._();
return _instance!; return _instance!;
} }
LocationMgr._(); LocationMgr._() {
mapModel = MapModel(
displayModel: displayModel,
renderer: jobRenderer,
symbolCache: symbolCache,
tileBitmapCache: bitmapCache,
);
}
Future<String?> startup() async { Future<String?> startup() async {
serviceEnabled = await location.serviceEnabled(); serviceEnabled = await location.serviceEnabled();
@ -41,8 +66,21 @@ class LocationMgr {
return "No permissions granted"; return "No permissions granted";
} }
} }
viewModel = ViewModel(displayModel: displayModel);
_subscription = location.onLocationChanged.listen((LocationData currentLocation) { _subscription = location.onLocationChanged.listen((LocationData currentLocation) {
_lastLocationData = currentLocation; _lastLocationData = currentLocation;
if (currentLocation.latitude != null && currentLocation.longitude != null) {
viewModel?.setMapViewPosition(currentLocation.latitude!, currentLocation.longitude!);
if (iconMarker == null) {
iconMarker ??= IconMarker(
fontSize: 30,
icon: Icons.gps_fixed,
color: Colors.red,
center: LatLong(currentLocation.latitude!, currentLocation.longitude!),
displayModel: displayModel);
mapModel.markerDataStores.add(MarkerDataStore()..addMarker(iconMarker!));
}
}
_subject.add(currentLocation); _subject.add(currentLocation);
}); });
return null; return null;
@ -51,6 +89,10 @@ class LocationMgr {
void shutdown() { void shutdown() {
_subscription?.cancel(); _subscription?.cancel();
_subscription = null; _subscription = null;
mapModel.markerDataStores.clear();
iconMarker = null;
viewModel?.dispose();
viewModel = null;
} }
Stream<LocationData> get stream => _subject.stream; Stream<LocationData> get stream => _subject.stream;

View file

@ -0,0 +1,26 @@
import 'package:flutter/cupertino.dart';
import 'package:mapsforge_flutter/core.dart';
import 'package:wien_talks_flutter/location_mgr.dart';
class MapfileWidget extends StatefulWidget {
const MapfileWidget({super.key});
@override
State<MapfileWidget> createState() => _MapfileWidgetState();
}
//////////////////////////////////////////////////////////////////////////////
class _MapfileWidgetState extends State<MapfileWidget> {
@override
Widget build(BuildContext context) {
return MapviewWidget(
displayModel: LocationMgr().displayModel,
createMapModel: () async {
return LocationMgr().mapModel;
},
createViewModel: () async {
return LocationMgr().viewModel!;
});
}
}

View file

@ -10,8 +10,11 @@ import file_picker
import file_selector_macos import file_selector_macos
import location import location
import path_provider_foundation import path_provider_foundation
<<<<<<< Updated upstream
import shared_preferences_foundation import shared_preferences_foundation
import sqflite_darwin import sqflite_darwin
=======
>>>>>>> Stashed changes
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin"))
@ -19,6 +22,9 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin")) LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
<<<<<<< Updated upstream
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
=======
>>>>>>> Stashed changes
} }

View file

@ -29,6 +29,8 @@ dependencies:
location: ^8.0.1 location: ^8.0.1
mapsforge_flutter: ^3.0.2
rxdart: ^0.28.0 rxdart: ^0.28.0
serverpod_flutter: 2.9.1 serverpod_flutter: 2.9.1
@ -59,32 +61,176 @@ flutter:
uses-material-design: true uses-material-design: true
# To add assets to your application, add an assets section, like this: # To add assets to your application, add an assets section, like this:
# assets: assets:
# - images/a_dot_burr.jpeg - assets/render_themes/
# - images/a_dot_ham.jpeg - packages/mapsforge_flutter/assets/patterns/dark_farmland.svg
- packages/mapsforge_flutter/assets/patterns/dark_military.png
- packages/mapsforge_flutter/assets/patterns/coniferous.svg
- packages/mapsforge_flutter/assets/patterns/coniferous_and_deciduous.svg
- packages/mapsforge_flutter/assets/patterns/deciduous.svg
- packages/mapsforge_flutter/assets/patterns/farmland.svg
- packages/mapsforge_flutter/assets/patterns/grass.svg
- packages/mapsforge_flutter/assets/patterns/hills.svg
- packages/mapsforge_flutter/assets/patterns/quarry.svg
- packages/mapsforge_flutter/assets/patterns/scrub.svg
- packages/mapsforge_flutter/assets/patterns/swamp.svg
- packages/mapsforge_flutter/assets/patterns/access-destination.png
- packages/mapsforge_flutter/assets/patterns/access-private.png
- packages/mapsforge_flutter/assets/patterns/arrow.png
- packages/mapsforge_flutter/assets/patterns/cemetery.png
- packages/mapsforge_flutter/assets/patterns/deciduous.svg
- packages/mapsforge_flutter/assets/patterns/dot.png
- packages/mapsforge_flutter/assets/patterns/farmland.svg
- packages/mapsforge_flutter/assets/patterns/grass.svg
- packages/mapsforge_flutter/assets/patterns/hills.svg
- packages/mapsforge_flutter/assets/patterns/marsh.png
- packages/mapsforge_flutter/assets/patterns/military.png
- packages/mapsforge_flutter/assets/patterns/nature-reserve.png
- packages/mapsforge_flutter/assets/patterns/pike.png
- packages/mapsforge_flutter/assets/patterns/quarry.svg
- packages/mapsforge_flutter/assets/patterns/rail.png
- packages/mapsforge_flutter/assets/patterns/scrub.svg
- packages/mapsforge_flutter/assets/patterns/swamp.svg
- packages/mapsforge_flutter/assets/patterns/wood-coniferous.png
- packages/mapsforge_flutter/assets/patterns/wood-deciduous.png
- packages/mapsforge_flutter/assets/patterns/wood-mixed.png
- packages/mapsforge_flutter/assets/symbols/bench.svg
- packages/mapsforge_flutter/assets/symbols/cable_car.svg
- packages/mapsforge_flutter/assets/symbols/chair_lift.svg
- packages/mapsforge_flutter/assets/symbols/dot_black.svg
- packages/mapsforge_flutter/assets/symbols/dot_blue.svg
- packages/mapsforge_flutter/assets/symbols/dot_blue_dark.svg
- packages/mapsforge_flutter/assets/symbols/dot_magenta.svg
- packages/mapsforge_flutter/assets/symbols/dot_white.svg
- packages/mapsforge_flutter/assets/symbols/gondola.svg
- packages/mapsforge_flutter/assets/symbols/oneway.svg
- packages/mapsforge_flutter/assets/symbols/peak.svg
- packages/mapsforge_flutter/assets/symbols/railway-crossing-small.svg
- packages/mapsforge_flutter/assets/symbols/railway-crossing.svg
- packages/mapsforge_flutter/assets/symbols/traffic_signal.svg
- packages/mapsforge_flutter/assets/symbols/volcano.svg
- packages/mapsforge_flutter/assets/symbols/accommodation/alpinehut.svg
- packages/mapsforge_flutter/assets/symbols/accommodation/camping.svg
- packages/mapsforge_flutter/assets/symbols/accommodation/caravan_park.svg
- packages/mapsforge_flutter/assets/symbols/accommodation/chalet.svg
- packages/mapsforge_flutter/assets/symbols/accommodation/hostel.svg
- packages/mapsforge_flutter/assets/symbols/accommodation/hotel2.svg
- packages/mapsforge_flutter/assets/symbols/accommodation/shelter2.svg
- packages/mapsforge_flutter/assets/symbols/amenity/firestation3.svg
- packages/mapsforge_flutter/assets/symbols/amenity/fountain2.svg
- packages/mapsforge_flutter/assets/symbols/amenity/library.svg
- packages/mapsforge_flutter/assets/symbols/amenity/playground.svg
- packages/mapsforge_flutter/assets/symbols/amenity/police2.svg
- packages/mapsforge_flutter/assets/symbols/amenity/post_box.svg
- packages/mapsforge_flutter/assets/symbols/amenity/post_office.svg
- packages/mapsforge_flutter/assets/symbols/amenity/recycling.svg
- packages/mapsforge_flutter/assets/symbols/amenity/telephone.svg
- packages/mapsforge_flutter/assets/symbols/amenity/toilets.svg
- packages/mapsforge_flutter/assets/symbols/barrier/blocks.svg
- packages/mapsforge_flutter/assets/symbols/barrier/bollard.svg
- packages/mapsforge_flutter/assets/symbols/barrier/cycle_barrier.svg
- packages/mapsforge_flutter/assets/symbols/barrier/gate.svg
- packages/mapsforge_flutter/assets/symbols/barrier/lift_gate.svg
- packages/mapsforge_flutter/assets/symbols/barrier/stile.svg
- packages/mapsforge_flutter/assets/symbols/custom/amenity/fountain2.svg
- packages/mapsforge_flutter/assets/symbols/custom/amenity/library.svg
- packages/mapsforge_flutter/assets/symbols/custom/amenity/toilets.svg
- packages/mapsforge_flutter/assets/symbols/custom/money/atm2.svg
- packages/mapsforge_flutter/assets/symbols/custom/tourist/archaeological2.svg
- packages/mapsforge_flutter/assets/symbols/custom/tourist/attraction.svg
- packages/mapsforge_flutter/assets/symbols/custom/tourist/castle2.svg
- packages/mapsforge_flutter/assets/symbols/custom/tourist/cinema2.svg
- packages/mapsforge_flutter/assets/symbols/custom/tourist/information.svg
- packages/mapsforge_flutter/assets/symbols/custom/tourist/memorial.svg
- packages/mapsforge_flutter/assets/symbols/custom/tourist/monument.svg
- packages/mapsforge_flutter/assets/symbols/custom/tourist/museum.svg
- packages/mapsforge_flutter/assets/symbols/custom/tourist/ruin.svg
- packages/mapsforge_flutter/assets/symbols/custom/tourist/theatre.svg
- packages/mapsforge_flutter/assets/symbols/custom/tourist/view_point.svg
- packages/mapsforge_flutter/assets/symbols/custom/tourist/windmill.svg
- packages/mapsforge_flutter/assets/symbols/custom/tourist/zoo.svg
- packages/mapsforge_flutter/assets/symbols/education/nursery3.svg
- packages/mapsforge_flutter/assets/symbols/education/school.svg
- packages/mapsforge_flutter/assets/symbols/education/university.svg
- packages/mapsforge_flutter/assets/symbols/food/bar.svg
- packages/mapsforge_flutter/assets/symbols/food/biergarten.svg
- packages/mapsforge_flutter/assets/symbols/food/cafe.svg
- packages/mapsforge_flutter/assets/symbols/food/drinkingtap.svg
- packages/mapsforge_flutter/assets/symbols/food/fastfood.svg
- packages/mapsforge_flutter/assets/symbols/food/pub.svg
- packages/mapsforge_flutter/assets/symbols/food/restaurant.svg
- packages/mapsforge_flutter/assets/symbols/health/doctors2.svg
- packages/mapsforge_flutter/assets/symbols/health/hospital.svg
- packages/mapsforge_flutter/assets/symbols/health/pharmacy.svg
- packages/mapsforge_flutter/assets/symbols/money/atm2.svg
- packages/mapsforge_flutter/assets/symbols/money/bank2.svg
- packages/mapsforge_flutter/assets/symbols/place_of_worship/buddhist.svg
- packages/mapsforge_flutter/assets/symbols/place_of_worship/christian.svg
- packages/mapsforge_flutter/assets/symbols/place_of_worship/hindu.svg
- packages/mapsforge_flutter/assets/symbols/place_of_worship/islamic.svg
- packages/mapsforge_flutter/assets/symbols/place_of_worship/jewish.svg
- packages/mapsforge_flutter/assets/symbols/place_of_worship/shinto.svg
- packages/mapsforge_flutter/assets/symbols/place_of_worship/unknown.svg
- packages/mapsforge_flutter/assets/symbols/poi/cave.svg
- packages/mapsforge_flutter/assets/symbols/poi/embassy2.svg
- packages/mapsforge_flutter/assets/symbols/poi/mountain_pass.svg
- packages/mapsforge_flutter/assets/symbols/shopping/alcohol.svg
- packages/mapsforge_flutter/assets/symbols/shopping/bakery.svg
- packages/mapsforge_flutter/assets/symbols/shopping/bicycle.svg
- packages/mapsforge_flutter/assets/symbols/shopping/book.svg
- packages/mapsforge_flutter/assets/symbols/shopping/butcher.svg
- packages/mapsforge_flutter/assets/symbols/shopping/car_repair.svg
- packages/mapsforge_flutter/assets/symbols/shopping/convenience.svg
- packages/mapsforge_flutter/assets/symbols/shopping/diy.svg
- packages/mapsforge_flutter/assets/symbols/shopping/greengrocer.svg
- packages/mapsforge_flutter/assets/symbols/shopping/laundrette.svg
- packages/mapsforge_flutter/assets/symbols/shopping/marketplace.svg
- packages/mapsforge_flutter/assets/symbols/shopping/supermarket.svg
- packages/mapsforge_flutter/assets/symbols/sport/golf.svg
- packages/mapsforge_flutter/assets/symbols/sport/shooting.svg
- packages/mapsforge_flutter/assets/symbols/sport/soccer.svg
- packages/mapsforge_flutter/assets/symbols/sport/stadium.svg
- packages/mapsforge_flutter/assets/symbols/sport/swimming_outdoor.svg
- packages/mapsforge_flutter/assets/symbols/sport/tennis.svg
- packages/mapsforge_flutter/assets/symbols/tourist/archaeological2.svg
- packages/mapsforge_flutter/assets/symbols/tourist/attraction.svg
- packages/mapsforge_flutter/assets/symbols/tourist/castle2.svg
- packages/mapsforge_flutter/assets/symbols/tourist/cinema2.svg
- packages/mapsforge_flutter/assets/symbols/tourist/information.svg
- packages/mapsforge_flutter/assets/symbols/tourist/memorial.svg
- packages/mapsforge_flutter/assets/symbols/tourist/monument.svg
- packages/mapsforge_flutter/assets/symbols/tourist/museum.svg
- packages/mapsforge_flutter/assets/symbols/tourist/picnic.svg
- packages/mapsforge_flutter/assets/symbols/tourist/ruin.svg
- packages/mapsforge_flutter/assets/symbols/tourist/theatre.svg
- packages/mapsforge_flutter/assets/symbols/tourist/view_point.svg
- packages/mapsforge_flutter/assets/symbols/tourist/windmill.svg
- packages/mapsforge_flutter/assets/symbols/tourist/zoo.svg
- packages/mapsforge_flutter/assets/symbols/transport/airport2.svg
- packages/mapsforge_flutter/assets/symbols/transport/bus_station.svg
- packages/mapsforge_flutter/assets/symbols/transport/bus_stop.svg
- packages/mapsforge_flutter/assets/symbols/transport/fuel.svg
- packages/mapsforge_flutter/assets/symbols/transport/helicopter.svg
- packages/mapsforge_flutter/assets/symbols/transport/lighthouse.svg
- packages/mapsforge_flutter/assets/symbols/transport/parking.svg
- packages/mapsforge_flutter/assets/symbols/transport/parking_private.svg
- packages/mapsforge_flutter/assets/symbols/transport/rental_bicycle.svg
- packages/mapsforge_flutter/assets/symbols/transport/slipway.svg
- packages/mapsforge_flutter/assets/symbols/transport/traffic_lights.svg
- packages/mapsforge_flutter/assets/symbols/transport/train_station2.svg
- packages/mapsforge_flutter/assets/symbols/transport/tram_stop.svg
- packages/mapsforge_flutter/assets/symbols/water/weir.svg
- packages/mapsforge_flutter/assets/symbols/windsock.svg
- packages/mapsforge_flutter/assets/symbols/viewpoint.svg
# An image asset can refer to one or more resolution-specific "variants", see fonts:
# https://flutter.dev/assets-and-images/#resolution-aware. - family: serif
fonts:
# For details regarding adding assets from package dependencies, see - asset: packages/mapsforge_flutter/assets/fonts/FreeSerif.otf
# https://flutter.dev/assets-and-images/#from-packages - asset: packages/mapsforge_flutter/assets/fonts/FreeSerifBold.otf
weight: 700
# To add custom fonts to your application, add a fonts section here, - asset: packages/mapsforge_flutter/assets/fonts/FreeSerifBoldItalic.otf
# in this "flutter" section. Each entry in this list should have a style: italic
# "family" key with the font family name, and a "fonts" key with a weight: 700
# list giving the asset and other descriptors for the font. For - asset: packages/mapsforge_flutter/assets/fonts/FreeSerifItalic.otf
# example: style: italic
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages