Skip to content

Instantly share code, notes, and snippets.

@Dhaval2404
Created April 18, 2021 17:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Dhaval2404/5279181bb7999aa1ad35d0d80786279b to your computer and use it in GitHub Desktop.
Save Dhaval2404/5279181bb7999aa1ad35d0d80786279b to your computer and use it in GitHub Desktop.
Geolocator didChangeAppLifecycleState loop issue
import 'dart:async';
import 'package:baseflow_plugin_template/baseflow_plugin_template.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
/// Defines the main theme color.
final MaterialColor themeMaterialColor =
BaseflowPluginExample.createMaterialColor(
const Color.fromRGBO(48, 49, 60, 1));
void main() {
runApp(BaseflowPluginExample(
pluginName: 'Geolocator',
githubURL: 'https://github.com/Baseflow/flutter-geolocator',
pubDevURL: 'https://pub.dev/packages/geolocator',
pages: [GeolocatorWidget.createPage()],
));
}
/// Example [Widget] showing the functionalities of the geolocator plugin
class GeolocatorWidget extends StatefulWidget {
/// Utility method to create a page with the Baseflow templating.
static ExamplePage createPage() {
return ExamplePage(Icons.location_on, (context) => GeolocatorWidget());
}
@override
_GeolocatorWidgetState createState() => _GeolocatorWidgetState();
}
class _GeolocatorWidgetState extends State<GeolocatorWidget> with WidgetsBindingObserver {
final List<_PositionItem> _positionItems = <_PositionItem>[];
StreamSubscription<Position> _positionStreamSubscription;
@override
void initState() {
WidgetsBinding.instance.addObserver(this);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).backgroundColor,
body: ListView.builder(
itemCount: _positionItems.length,
itemBuilder: (context, index) {
final positionItem = _positionItems[index];
if (positionItem.type == _PositionItemType.permission) {
return ListTile(
title: Text(positionItem.displayValue,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
)),
);
} else {
return Card(
child: ListTile(
tileColor: themeMaterialColor,
title: Text(
positionItem.displayValue,
style: TextStyle(color: Colors.white),
),
),
);
}
},
),
floatingActionButton: Stack(
children: <Widget>[
Positioned(
bottom: 10.0,
right: 10.0,
child: FloatingActionButton.extended(
onPressed: () => setState(_positionItems.clear),
label: Text("clear"),
),
),
Positioned(
bottom: 80.0,
right: 10.0,
child: FloatingActionButton.extended(
onPressed: () async {
await Geolocator.getLastKnownPosition().then((value) => {
_positionItems.add(_PositionItem(
_PositionItemType.position, value.toString()))
});
setState(
() {},
);
},
label: Text("Last Position"),
),
),
Positioned(
bottom: 150.0,
right: 10.0,
child: FloatingActionButton.extended(
onPressed: () async {
await Geolocator.getCurrentPosition().then((value) => {
_positionItems.add(_PositionItem(
_PositionItemType.position, value.toString()))
});
setState(
() {},
);
},
label: Text("Current Position")),
),
Positioned(
bottom: 220.0,
right: 10.0,
child: FloatingActionButton.extended(
onPressed: _toggleListening,
label: Text(() {
if (_positionStreamSubscription == null) {
return "Start stream";
} else {
final buttonText = _positionStreamSubscription.isPaused
? "Resume"
: "Pause";
return "$buttonText stream";
}
}()),
backgroundColor: _determineButtonColor(),
),
),
Positioned(
bottom: 290.0,
right: 10.0,
child: FloatingActionButton.extended(
onPressed: () async {
await Geolocator.checkPermission().then((value) => {
_positionItems.add(_PositionItem(
_PositionItemType.permission, value.toString()))
});
setState(() {});
},
label: Text("Check Permission"),
),
),
Positioned(
bottom: 360.0,
right: 10.0,
child: FloatingActionButton.extended(
onPressed: () async {
await Geolocator.requestPermission().then((value) => {
_positionItems.add(_PositionItem(
_PositionItemType.permission, value.toString()))
});
setState(() {});
},
label: Text("Request Permission"),
),
),
],
),
);
}
bool _isListening() => (_positionStreamSubscription == null ||
_positionStreamSubscription.isPaused);
Color _determineButtonColor() {
return _isListening() ? Colors.green : Colors.red;
}
void _toggleListening() {
if (_positionStreamSubscription == null) {
final positionStream = Geolocator.getPositionStream();
_positionStreamSubscription = positionStream.handleError((error) {
_positionStreamSubscription?.cancel();
_positionStreamSubscription = null;
}).listen((position) => setState(() => _positionItems.add(
_PositionItem(_PositionItemType.position, position.toString()))));
_positionStreamSubscription?.pause();
}
setState(() {
if (_positionStreamSubscription == null) {
return;
}
if (_positionStreamSubscription.isPaused) {
_positionStreamSubscription.resume();
} else {
_positionStreamSubscription.pause();
}
});
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
if (_positionStreamSubscription = null) {
_positionStreamSubscription.cancel();
_positionStreamSubscription = null;
}
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
print("_didChangeAppLifecycleState: $state");
}
}
enum _PositionItemType {
permission,
position,
}
class _PositionItem {
_PositionItem(this.type, this.displayValue);
final _PositionItemType type;
final String displayValue;
}
name: flutter_sample_app
description: A new Flutter application.
# The following line prevents the package from being accidentally published to
# pub.dev using `pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1
environment:
sdk: ">=2.10.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
geolocator: ^7.0.3
baseflow_plugin_template:
git:
url: git://github.com/Baseflow/baseflow_plugin_template.git
ref: v2.0.0-nullsafety
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
dev_dependencies:
flutter_test:
sdk: flutter
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
# To add assets to your application, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware.
# For details regarding adding assets from package dependencies, see
# https://flutter.dev/assets-and-images/#from-packages
# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment