Skip to content

Both copy text to your clipboard — Build with AI copies a setup prompt to paste into Claude Code, Cursor, Codex or Copilot; Copy page as Markdown copies this page to paste into a chat. How it works

Fullscreen Map in Flutter

This tutorial shows how to create a fullscreen map that fills the entire screen, removing the app bar and status bar for an immersive experience.

Prerequisites

Before you begin, ensure you have:

Basic Fullscreen Map

The simplest way — just use the MapMetricsView widget as the entire body without an AppBar:

dart
import 'package:flutter/material.dart';
import 'package:mapmetrics/mapmetrics.dart';

class FullscreenMapScreen extends StatefulWidget {
  @override
  _FullscreenMapScreenState createState() => _FullscreenMapScreenState();
}

class _FullscreenMapScreenState extends State<FullscreenMapScreen> {
  MapController? mapController;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: MapMetricsView(
        options: MapOptions(
          initCenter: Position(2.3522, 48.8566), // lng, lat — Paris
          initZoom: 12,
          initStyle:
              'https://gateway.mapmetrics-atlas.net/styles/?fileName=YOUR_STYLE_ID/YOUR_STYLE.json&token=YOUR_API_KEY',
        ),
        onMapCreated: (MapController controller) {
          mapController = controller;
        },
      ),
    );
  }
}

True Fullscreen (Hide Status Bar)

For a fully immersive experience, hide the system status bar and navigation bar:

dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:mapmetrics/mapmetrics.dart';

class ImmersiveMapScreen extends StatefulWidget {
  @override
  _ImmersiveMapScreenState createState() => _ImmersiveMapScreenState();
}

class _ImmersiveMapScreenState extends State<ImmersiveMapScreen> {
  MapController? mapController;

  @override
  void initState() {
    super.initState();
    // Hide status bar and navigation bar for true fullscreen
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
  }

  @override
  void dispose() {
    // Restore system UI when leaving the screen
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: MapMetricsView(
        options: MapOptions(
          initCenter: Position(2.3522, 48.8566), // lng, lat — Paris
          initZoom: 12,
          initStyle:
              'https://gateway.mapmetrics-atlas.net/styles/?fileName=YOUR_STYLE_ID/YOUR_STYLE.json&token=YOUR_API_KEY',
        ),
        onMapCreated: (MapController controller) {
          mapController = controller;
        },
      ),
    );
  }
}

Toggle Fullscreen Mode

Let users switch between normal and fullscreen views:

dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:mapmetrics/mapmetrics.dart';

class ToggleFullscreenScreen extends StatefulWidget {
  @override
  _ToggleFullscreenScreenState createState() => _ToggleFullscreenScreenState();
}

class _ToggleFullscreenScreenState extends State<ToggleFullscreenScreen> {
  MapController? mapController;
  bool isFullscreen = false;

  void _toggleFullscreen() {
    setState(() {
      isFullscreen = !isFullscreen;
    });

    if (isFullscreen) {
      SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
    } else {
      SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
    }
  }

  @override
  void dispose() {
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: isFullscreen
          ? null
          : AppBar(title: Text('Map View')),
      body: Stack(
        children: [
          MapMetricsView(
            options: MapOptions(
              initCenter: Position(2.3522, 48.8566), // lng, lat — Paris
              initZoom: 12,
              initStyle:
                  'https://gateway.mapmetrics-atlas.net/styles/?fileName=YOUR_STYLE_ID/YOUR_STYLE.json&token=YOUR_API_KEY',
            ),
            onMapCreated: (controller) => mapController = controller,
          ),
          // Fullscreen toggle button
          Positioned(
            top: isFullscreen ? 40 : 8,
            right: 8,
            child: FloatingActionButton.small(
              onPressed: _toggleFullscreen,
              backgroundColor: Colors.white,
              child: Icon(
                isFullscreen ? Icons.fullscreen_exit : Icons.fullscreen,
                color: Colors.black87,
              ),
            ),
          ),
        ],
      ),
    );
  }
}

System UI Modes

ModeDescription
SystemUiMode.edgeToEdgeNormal mode — status bar and nav bar visible
SystemUiMode.immersiveFullscreen — swipe from edge to reveal bars
SystemUiMode.immersiveStickyFullscreen — bars appear briefly on swipe, then fade
SystemUiMode.leanBackFullscreen — tap anywhere to reveal bars

Next Steps


Tip: Always restore SystemUiMode.edgeToEdge in dispose() so other screens in your app are not affected by the fullscreen mode.