------------------------- | Current Location | |-----------------------| | | | Latitude: | | Longitude: | | | | [Get Current Location]| -------------------------
Location and GPS in Flutter - Mini App: Build & Ship
import 'package:flutter/material.dart'; class CurrentLocationScreen extends StatefulWidget { @override State<CurrentLocationScreen> createState() => _CurrentLocationScreenState(); } class _CurrentLocationScreenState extends State<CurrentLocationScreen> { String latitude = ''; String longitude = ''; bool isLoading = false; String error = ''; // TODO: Add method to get current location @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Current Location')), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Latitude: $latitude'), SizedBox(height: 8), Text('Longitude: $longitude'), SizedBox(height: 16), if (isLoading) CircularProgressIndicator(), if (error.isNotEmpty) Text(error, style: TextStyle(color: Colors.red)), SizedBox(height: 16), ElevatedButton( onPressed: () { // TODO: Call method to get location }, child: Text('Get Current Location'), ), ], ), ), ); } }
import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; class CurrentLocationScreen extends StatefulWidget { @override State<CurrentLocationScreen> createState() => _CurrentLocationScreenState(); } class _CurrentLocationScreenState extends State<CurrentLocationScreen> { String latitude = ''; String longitude = ''; bool isLoading = false; String error = ''; Future<void> _getCurrentLocation() async { setState(() { isLoading = true; error = ''; }); bool serviceEnabled; LocationPermission permission; serviceEnabled = await Geolocator.isLocationServiceEnabled(); if (!serviceEnabled) { setState(() { error = 'Location services are disabled.'; isLoading = false; }); return; } permission = await Geolocator.checkPermission(); if (permission == LocationPermission.denied) { permission = await Geolocator.requestPermission(); if (permission == LocationPermission.denied) { setState(() { error = 'Location permission denied.'; isLoading = false; }); return; } } if (permission == LocationPermission.deniedForever) { setState(() { error = 'Location permissions are permanently denied.'; isLoading = false; }); return; } try { Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high); setState(() { latitude = position.latitude.toStringAsFixed(6); longitude = position.longitude.toStringAsFixed(6); isLoading = false; }); } catch (e) { setState(() { error = 'Failed to get location: $e'; isLoading = false; }); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Current Location')), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Latitude: $latitude'), SizedBox(height: 8), Text('Longitude: $longitude'), SizedBox(height: 16), if (isLoading) CircularProgressIndicator(), if (error.isNotEmpty) Text(error, style: TextStyle(color: Colors.red)), SizedBox(height: 16), ElevatedButton( onPressed: isLoading ? null : _getCurrentLocation, child: Text('Get Current Location'), ), ], ), ), ); } }
This solution uses the geolocator package to get the device's current GPS location.
First, it checks if location services are enabled. Then it requests permission if not already granted. If permission is denied or permanently denied, it shows an error message.
When permission is granted, it fetches the current position with high accuracy. The latitude and longitude are updated in the state and shown on the screen.
A loading spinner appears while fetching the location, and the button is disabled to prevent multiple requests.
If any error occurs, it is displayed in red text below the coordinates.
------------------------- | Current Location | |-----------------------| | | | Latitude: 37.421998 | | Longitude: -122.0840 | | | | [Loading...] | | | | [Get Current Location]| -------------------------
Practice
What is the main purpose of using the location feature in a Flutter app?
Solution
Step 1: Understand location feature usage
The location feature is used to get the device's position on Earth.Step 2: Compare options with location purpose
Only To find the device's current position on the map relates to finding the device's position, others are unrelated.Final Answer:
To find the device's current position on the map -> Option DQuick Check:
Location feature = Find position [OK]
- Confusing location with other device features
- Thinking location controls device settings
- Assuming location sends messages or plays music
Which of the following is the correct way to request location permission in Flutter using the permission_handler package?
final status = await Permission.location.____();Solution
Step 1: Recall permission_handler syntax
The package usesrequest()to ask for permission.Step 2: Match method to code snippet
Onlyrequestfits the method call to request permission.Final Answer:
request -> Option BQuick Check:
Permission request method = request() [OK]
- Using ask() instead of request()
- Confusing get() with permission request
- Using allow() which is not a method
What will the following Flutter code print if the device's location is successfully fetched?
var location = await Geolocator.getCurrentPosition();
print('Lat: ${location.latitude}, Lon: ${location.longitude}');Solution
Step 1: Understand getCurrentPosition()
This method returns the device's current latitude and longitude as numbers.Step 2: Analyze print output
The print statement outputs the latitude and longitude values, which are numbers, not null or zero by default.Final Answer:
Lat: [some number], Lon: [some number] -> Option AQuick Check:
getCurrentPosition() returns coordinates [OK]
- Assuming coordinates are zero or null by default
- Expecting syntax error from correct code
- Confusing method with one that returns null
Identify the error in this Flutter code snippet that tries to get location updates:
StreamSubscription positionStream = Geolocator.getPositionStream().listen((Position position) {
print(position.latitude);
});
positionStream.cancel();Solution
Step 1: Check permission handling
The code does not check or request location permission before starting the stream.Step 2: Review other options
Usinglistenis correct;cancel()is valid but should be called later; Position type is correct.Final Answer:
Missing permission check before listening to location stream -> Option AQuick Check:
Permission check required before location stream [OK]
- Skipping permission request before location access
- Confusing listen() with subscribe()
- Calling cancel() too early without reason
- Wrong type for position parameter
You want your Flutter app to continuously track the user's location but only update the UI when the user moves more than 50 meters. Which approach is best?
Solution
Step 1: Understand continuous tracking with filtering
ThegetPositionStream()method can listen for location changes and supports adistanceFilterto limit updates.Step 2: Compare options for efficiency
UsegetPositionStream(distanceFilter: 50)to listen for updates usesdistanceFilter: 50to update only when user moves 50 meters, saving resources and avoiding UI overload.Step 3: Eliminate other options
UsegetCurrentPosition()repeatedly every second is inefficient; C updates too often; D only gets location once.Final Answer:
Use getPositionStream(distanceFilter: 50) to listen for updates -> Option CQuick Check:
Use stream with distanceFilter for efficient updates [OK]
- Polling location repeatedly instead of streaming
- Updating UI on every small location change
- Using getLastKnownPosition for continuous tracking
Ready to prove it?
Pass the test and this pattern moves unknown
