mapsforge_flutter icon indicating copy to clipboard operation
mapsforge_flutter copied to clipboard

Map is not loading

Open vasilevzhivko opened this issue 1 year ago • 0 comments

I have the following piece of code:

class Hbg extends StatelessWidget {
  const Hbh({super.key});

  Future<MapContext> _initialize(BuildContext ctx, Widget child) async {
    final map = await MapFile.using(
        (await DefaultAssetBundle.of(ctx).load("assets/map/mo.map"))
            .buffer
            .asUint8List(),
        null,
        null);

    // Create the cache for assets
    final symbolCache = FileSymbolCache();

    final DisplayModel displayModel = DisplayModel(fontScaleFactor: 0.5);

    // Create the render theme which specifies how to render the informations
    // from the mapfile.
    final renderTheme = await RenderThemeBuilder.create(
      displayModel,
      'assets/map/mapstyles/Elevate.xml',
    );

    // Create the Renderer
    final jobRenderer =
        MapDataStoreRenderer(map, renderTheme, symbolCache, true);

    var bitmapCache =
        await FileTileBitmapCache.create(jobRenderer.getRenderKey());
    bitmapCache.purgeAll();

    var viewModel = ViewModel(
        displayModel: displayModel,
        contextMenuBuilder: null // Remove default ContextMenuBuilder
        );

    viewModel.setZoomLevel(19);

    var context = MapContext(
        map: map,
        jobRenderer: jobRenderer,
        symbolCache: symbolCache,
        bitmapCache: bitmapCache,
        displayModel: displayModel,
        viewModel: viewModel,
        child: child);

    return context;
  }

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FutureBuilder<MapContext>(
        future: _initialize(
            context, const MapPage()), // The future that loads your map data
        builder: (context, snapshot) {
          if (snapshot.connectionState != ConnectionState.done) {
            // This shows a loading view while data is still being fetched/initialized
            return const LoadingView();
          } else if (snapshot.hasError) {
            // Handles any errors that occur during fetching/initializing
            return Scaffold(
              body: Center(
                child: Text('Error loading map data: ${snapshot.error}'),
              ),
            );
          } else if (snapshot.hasData) {
            // Once the data is successfully loaded, the map data is available
            return snapshot
                .requireData; // Directly using the loaded MapContext data
          } else {
            // Handles the case where no data is returned but also no error (unlikely but safe to handle)
            return Scaffold(
              body: Center(
                child: Text('No data available.'),
              ),
            );
          }
        },
      ),
      routes: {
        '/mapHome': (ctx) => const MapPage(),
        //'/hutDetail': (ctx) => const HutDetails(hutData: null,),
        //'/3': (ctx) => Widget3(),
      },
    );
  }
}

and I want to populate my MapContext which looks like that:

import 'package:flutter/material.dart';
import 'package:hbg/app/services/gps/gps_service.dart';
import 'package:mapsforge_flutter/core.dart';
import 'package:mapsforge_flutter/datastore.dart';
import 'package:mapsforge_flutter/maps.dart';

class MapContext extends InheritedWidget {
  MapContext({
    super.key,
    required child,
    required this.map,
    required this.jobRenderer,
    required this.symbolCache,
    required this.bitmapCache,
    required this.displayModel,
    required this.viewModel,
  }) : super(child: child);

  final MapDataStore map;
  final JobRenderer jobRenderer;
  final SymbolCache symbolCache;
  final FileTileBitmapCache bitmapCache;
  final DisplayModel displayModel;
  final ViewModel viewModel;
  final GpsService gpsService = GpsService();

  static MapContext of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<MapContext>()!;
  }

  @override
  bool updateShouldNotify(MapContext oldWidget) {
    return false;
  }
}

The problem is my map file is null once I try to load it (the asset exists 100% and its defined in pubspec.yaml). The error that I am getting is:

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following assertion was thrown building MapPage(dirty, dependencies: [MapContext], state:
_MapPageState#36d6f(ticker inactive)):
'package:mapsforge_flutter/src/mapfile/mapfileheader.dart': Failed assertion: line 51 pos 12:
'mapFileInfo != null': is not true.

The relevant error-causing widget was:
  MapPage MapPage:file:///Users/zhivkovasilev/Development/hbg/hbgapp/lib/main.dart:104:28

When the exception was thrown, this was the stack:
#2      MapFileHeader.getMapFileInfo (package:mapsforge_flutter/src/mapfile/mapfileheader.dart:51:12)
#3      MapFile.getMapFileInfo (package:mapsforge_flutter/src/mapfile/mapfile.dart:167:32)
#4      MapFile.startPosition (package:mapsforge_flutter/src/mapfile/mapfile.dart:570:17)
#5      _MapPageState.build (package:hbg/features/map/views/map_home.dart:296:32)
#6      StatefulElement.build (package:flutter/src/widgets/framework.dart:5592:27)
#7      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5480:15)
#8      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5643:11)
#9      Element.rebuild (package:flutter/src/widgets/framework.dart:5196:7)
#10     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:5462:5)
#11     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:5634:11)
#12     ComponentElement.mount (package:flutter/src/widgets/framework.dart:5456:5)
...     Normal element mounting (7 frames)
#19     Element.inflateWidget (package:flutter/src/widgets/framework.dart:4335:16)
#20     Element.updateChild (package:flutter/src/widgets/framework.dart:3840:20)
#21     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5505:16)
#22     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5643:11)
#23     Element.rebuild (package:flutter/src/widgets/framework.dart:5196:7)
#24     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2904:19)
#25     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:989:21)
#26     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:448:5)
#27     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1386:15)
#28     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1311:9)
#29     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1169:5)
#30     _invoke (dart:ui/hooks.dart:312:13)
#31     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:399:5)
#32     _drawFrame (dart:ui/hooks.dart:283:31)
(elided 2 frames from class _AssertionError)

Any idea what I might be missing here? The map file is around 930MB

vasilevzhivko avatar May 08 '24 21:05 vasilevzhivko