Map location picker for flutter Based on google_maps_flutter

Overview

map_location_picker:

Pub Version GitHub Repo stars GitHub Repo forks GitHub Repo issues GitHub Repo contributors

A simple library to pick a location on a map.

Made by Arvind @rvndsngwn:

  • Compatibility with Geolocator
  • Use of Google map APIs
  • Added support for flutter web
  • All new customizations are done in the MapLocationPicker class
Android iOS Flutter Web
Support SDK 20+ iOS 9+ Yes

Location picker using the official google_maps_flutter.

I made This plugin because google deprecated Place Picker.

Video Decoded Address Places autocomplete

Setup

Pubspec changes:

      dependencies:
        map_location_picker: ^1.0.1

You can now add a GoogleMap widget to your widget tree.

import 'package:map_location_picker/map_location_picker.dart';

MapLocationPicker(
  apiKey: "YOUR_API_KEY",
  onNext: (GeocodingResult? result) {
      ...
   },
);

Getting Started

For more details, see Getting started with Google Maps Platform.

Android

  1. Set the minSdkVersion in android/app/build.gradle:
android {
    defaultConfig {
        minSdkVersion 20
    }
}

This means that app will only be available for users that run Android SDK 20 or higher.

  1. Specify your API key in the application manifest android/app/src/main/AndroidManifest.xml:
<manifest ...
  <application ...
    <meta-data android:name="com.google.android.geo.API_KEY"
               android:value="YOUR KEY HERE"/>

Hybrid Composition

To use Hybrid Composition to render the GoogleMap widget on Android, set AndroidGoogleMapsFlutter.useAndroidViewSurface to true.

if (defaultTargetPlatform == TargetPlatform.android) {
  AndroidGoogleMapsFlutter.useAndroidViewSurface = true;
}

iOS

To set up, specify your API key in the application delegate ios/Runner/AppDelegate.m:

#include "AppDelegate.h"
#include "GeneratedPluginRegistrant.h"
#import "GoogleMaps/GoogleMaps.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [GMSServices provideAPIKey:@"YOUR KEY HERE"];
  [GeneratedPluginRegistrant registerWithRegistry:self];
  return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end

Or in your swift code, specify your API key in the application delegate ios/Runner/AppDelegate.swift:

import UIKit
import Flutter
import GoogleMaps
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GMSServices.provideAPIKey("YOUR KEY HERE")
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

Web View

Modify web/index.html

Get an API Key for Google Maps JavaScript API. Get started here.

Modify the <head> tag of your web/index.html to load the Google Maps JavaScript API, like so:

<head>
  <!-- // Other stuff -->

  <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
</head>

Note

The following permissions are not required to use Google Maps Android API v2, but are recommended.

android.permission.ACCESS_COARSE_LOCATION Allows the API to use WiFi or mobile cell data (or both) to determine the device's location. The API returns the location with an accuracy approximately equivalent to a city block.

android.permission.ACCESS_FINE_LOCATION Allows the API to determine as precise a location as possible from the available location providers, including the Global Positioning System (GPS) as well as WiFi and mobile cell data.


You must also explicitly declare that your app uses the android.hardware.location.network or android.hardware.location.gps hardware features if your app targets Android 5.0 (API level 21) or higher and uses the ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission in order to receive location updates from the network or a GPS, respectively.

<uses-feature android:name="android.hardware.location.network" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false"  />

The following permissions are defined in the package manifest, and are automatically merged into your app's manifest at build time. You don't need to add them explicitly to your manifest:

android.permission.INTERNET Used by the API to download map tiles from Google Maps servers.

android.permission.ACCESS_NETWORK_STATE Allows the API to check the connection status in order to determine whether data can be downloaded.

Restricting Autocomplete Search to Region

The Results returned can be restricted to certain countries by passing an array of country codes into the components parameter of MapLocationPicker. Countries must be two character, ISO 3166-1 Alpha-2 compatible. You can find code information at Wikipedia: List of ISO 3166 country codes or the ISO Online Browsing Platform.

The example below restricts Autocomplete Search to the United Arab Emirates and Nigeria

MapLocationPicker(
 apiKey: "YOUR_API_KEY",
 onNext: (GeocodingResult? result) {
   ...
  },
);

See the example directory for a complete sample app.

Parameters of the MapLocationPicker

/// Padding around the map
final EdgeInsets padding;

/// Compass for the map (default: true)
final bool compassEnabled;

/// Lite mode for the map (default: false)
final bool liteModeEnabled;

/// API key for the map & places
final String apiKey;

/// GPS accuracy for the map
final LocationAccuracy desiredAccuracy;

/// GeoCoding base url
final String? geoCodingBaseUrl;

/// GeoCoding http client
final Client? geoCodingHttpClient;

/// GeoCoding api headers
final Map<String, String>? geoCodingApiHeaders;

/// GeoCoding location type
final List<String> locationType;

/// GeoCoding result type
final List<String> resultType;

/// Map minimum zoom level & maximum zoom level
final MinMaxZoomPreference minMaxZoomPreference;

/// Top card margin
final EdgeInsetsGeometry topCardMargin;

/// Top card color
final Color? topCardColor;

/// Top card shape
final ShapeBorder topCardShape;

/// Top card text field border radius
final BorderRadius? borderRadius;

/// Top card text field hint text
final String searchHintText;

/// Bottom card shape
final ShapeBorder bottomCardShape;

/// Bottom card margin
final EdgeInsetsGeometry bottomCardMargin;

/// Bottom card icon
final Icon bottomCardIcon;

/// Bottom card tooltip
final String bottomCardTooltip;

/// Bottom card color
final Color? bottomCardColor;

/// On Suggestion Selected callback
final Function(PlacesDetailsResponse?)? onSuggestionSelected;

/// On Next Page callback
final Function(GeocodingResult?) onNext;

/// Show back button (default: true)
final bool showBackButton;

/// Popup route on next press (default: false)
final bool canPopOnNextButtonTaped;

/// Back button replacement when [showBackButton] is false and [backButton] is not null
final Widget? backButton;

/// Show more suggestions
final bool showMoreOptions;

/// Dialog title
final String dialogTitle;

/// httpClient is used to make network requests.
final Client? placesHttpClient;

/// apiHeader is used to add headers to the request.
final Map<String, String>? placesApiHeaders;

/// baseUrl is used to build the url for the request.
final String? placesBaseUrl;

/// Session token for Google Places API
final String? sessionToken;

/// Offset for pagination of results
/// offset: int,
final num? offset;

/// Origin location for calculating distance from results
/// origin: Location(lat: -33.852, lng: 151.211),
final Location? origin;

/// Location bounds for restricting results to a radius around a location
/// location: Location(lat: -33.867, lng: 151.195)
final Location? location;

/// Radius for restricting results to a radius around a location
/// radius: Radius in meters
final num? radius;

/// Language code for Places API results
/// language: 'en',
final String? language;

/// Types for restricting results to a set of place types
final List<String> types;

/// Components set results to be restricted to a specific area
/// components: [Component(Component.country, "us")]
final List<Component> components;

/// Bounds for restricting results to a set of bounds
final bool strictbounds;

/// Region for restricting results to a set of regions
/// region: "us"
final String? region;

/// fields
final List<String> fields;

💰 You can help me by Donating

BuyMeACoffee PayPal Ko-Fi

👨🏻‍💻Contribute to the project

All contributions are welcome.

GitHub

Comments
  • More languages support / handle no language support

    More languages support / handle no language support

    My app uses 2 languages, english and greek, when the phone is on greek the package doesn't work correctly, apparently greek language is not supported by the package and the top bar is a red box..

    Either it should have more languages to support or have a fallback that if it doesn't find the device's language to get a default (eg english Screenshot_1 )

    enhancement 
    opened by Lampat 4
  • Lost connection do device after

    Lost connection do device after "Error"

    Hello @rvndsngwn ,

    I've been testing your package for a few days and i figure that sometimes, on Android, i lost the connection to device.

    I choose the address, and after i click the arrow to deal with that data i have this on the console:

    I/chatty  (16519): uid=10163(pt.******.app) androidmapsapi- identical 3 lines
    I/Counters(16519): exceeded sample count in FrameTime
    I/Counters(16519): exceeded sample count in FrameTime
    E/AndroidRuntime(16519): FATAL EXCEPTION: GLThread 1157
    E/AndroidRuntime(16519): Process: pt.******.app, PID: 16519
    E/AndroidRuntime(16519): java.lang.NullPointerException: Attempt to get length of null array
    E/AndroidRuntime(16519): 	at java.nio.ByteBufferAsIntBuffer.put(ByteBufferAsIntBuffer.java:122)
    E/AndroidRuntime(16519): 	at com.google.maps.api.android.lib6.gmm6.vector.gl.buffer.n.i(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (150700-0):2)
    E/AndroidRuntime(16519): 	at com.google.maps.api.android.lib6.gmm6.vector.gl.buffer.n.d(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (150700-0):3)
    E/AndroidRuntime(16519): 	at com.google.maps.api.android.lib6.gmm6.vector.gl.drawable.d.s(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (150700-0):2)
    E/AndroidRuntime(16519): 	at com.google.maps.api.android.lib6.gmm6.vector.gl.drawable.ao.s(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (150700-0):12)
    E/AndroidRuntime(16519): 	at com.google.maps.api.android.lib6.gmm6.vector.bz.s(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (150700-0):29)
    E/AndroidRuntime(16519): 	at com.google.maps.api.android.lib6.gmm6.vector.bs.b(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (150700-0):151)
    E/AndroidRuntime(16519): 	at com.google.maps.api.android.lib6.gmm6.vector.an.run(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (150700-0):48)
    E/flutter (16519): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: setState() called after dispose(): LocationPickerState#5a7cf(lifecycle state: defunct, not mounted)
    E/flutter (16519): This error happens if you call setState() on a State object for a widget that no longer appears in the widget tree (e.g., whose parent widget no longer includes the widget in its build). This error can occur when code calls setState() from a timer or an animation callback.
    E/flutter (16519): The preferred solution is to cancel the timer or stop listening to the animation in the dispose() callback. Another solution is to check the "mounted" property of this object before calling setState() to ensure the object is still in the tree.
    E/flutter (16519): This error might indicate a memory leak if setState() is being called because another object is retaining a reference to this State object after it has been removed from the tree. To avoid memory leaks, consider breaking the reference to this object during dispose().
    E/flutter (16519): #0      State.setState.<anonymous closure> (package:flutter/src/widgets/framework.dart:1078:9)
    E/flutter (16519): #1      State.setState (package:flutter/src/widgets/framework.dart:1113:6)
    E/flutter (16519): #2      LocationPickerState.searchPlace (package:map_location_picker/src/google_map_location_picker.dart:109:5)
    E/flutter (16519): #3      LocationPickerState.build.<anonymous closure>.<anonymous closure> (package:map_location_picker/src/google_map_location_picker.dart:413:26)
    E/flutter (16519): #4      SearchInputState.onSearchInputChange.<anonymous closure> (package:map_location_picker/src/search_input.dart:58:27)
    E/flutter (16519): #5      Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:18:15)
    E/flutter (16519): #6      _Timer._runTimers (dart:isolate-patch/timer_impl.dart:398:19)
    E/flutter (16519): #7      _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:429:5)
    E/flutter (16519): #8      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
    E/flutter (16519): 
    E/flutter (16519): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: 'package:flutter/src/rendering/object.dart': Failed assertion: line 2461 pos 12: '!_debugDisposed': is not true.
    E/flutter (16519): #0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:51:61)
    E/flutter (16519): #1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5)
    E/flutter (16519): #2      RenderObject.markNeedsPaint (package:flutter/src/rendering/object.dart:2461:12)
    E/flutter (16519): #3      RenderAndroidView._sizePlatformView (package:flutter/src/rendering/platform_view.dart:192:5)
    E/flutter (16519): <asynchronous suspension>
    E/flutter (16519): 
    I/Process (16519): Sending signal. PID: 16519 SIG: 9
    Lost connection to device.
    

    And the app crashes.

    That happens only sometimes but even in the production build.

    bug 
    opened by DevTiago 4
  • LateInitializationError on _geocodingresult

    LateInitializationError on _geocodingresult

    E/flutter (16095): [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: LateInitializationError: Field '_geocodingResult@1800352992' has not been initialized. E/flutter (16095): #0 _MapLocationPickerState._geocodingResult (package:map_location_picker/src/map_location_picker.dart) package:map_location_picker/src/map_location_picker.dart:1 E/flutter (16095): #1 _MapLocationPickerState.build.<anonymous closure> package:map_location_picker/src/map_location_picker.dart:502 E/flutter (16095): #2 _MapLocationPickerState.build.<anonymous closure> package:map_location_picker/src/map_location_picker.dart:501 E/flutter (16095): #3 _InkResponseState._handleTap package:flutter/…/material/ink_well.dart:1005 E/flutter (16095): #4 GestureRecognizer.invokeCallback package:flutter/…/gestures/recognizer.dart:198 E/flutter (16095): #5 TapGestureRecognizer.handleTapUp package:flutter/…/gestures/tap.dart:613 E/flutter (16095): #6 BaseTapGestureRecognizer._checkUp package:flutter/…/gestures/tap.dart:298 E/flutter (16095): #7 BaseTapGestureRecognizer.acceptGesture package:flutter/…/gestures/tap.dart:269 E/flutter (16095): #8 GestureArenaManager.sweep package:flutter/…/gestures/arena.dart:157 E/flutter (16095): #9 GestureBinding.handleEvent package:flutter/…/gestures/binding.dart:449 E/flutter (16095): #10 GestureBinding.dispatchEvent package:flutter/…/gestures/binding.dart:425 E/flutter (16095): #11 RendererBinding.dispatchEvent package:flutter/…/rendering/binding.dart:329 E/flutter (16095): #12 GestureBinding._handlePointerEventImmediately package:flutter/…/gestures/binding.dart:380 E/flutter (16095): #13 GestureBinding.handlePointerEvent package:flutter/…/gestures/binding.dart:344 E/flutter (16095): #14 GestureBinding._flushPointerEventQueue package:flutter/…/gestures/binding.dart:302 E/flutter (16095): #15 GestureBinding._handlePointerDataPacket package:flutter/…/gestures/binding.dart:285 E/flutter (16095): #16 _rootRunUnary (dart:async/zone.dart:1442:13) E/flutter (16095): #17 _CustomZone.runUnary (dart:async/zone.dart:1335:19) E/flutter (16095): #18 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7) E/flutter (16095): #19 _invoke1 (dart:ui/hooks.dart:170:10) E/flutter (16095): #20 PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:331:7) E/flutter (16095): #21 _dispatchPointerDataPacket (dart:ui/hooks.dart:94:31)

    image

    image

    this exception is thrown if the user doesn't select any location and clicks next. the solution might be to remove late from _geocodingResult since it's already nullable.

    or not displaying the next button until there is location loaded.

    opened by stha-ums 2
  • Cannot select a location directly after searching in the search bar

    Cannot select a location directly after searching in the search bar

    E/flutter (12031): [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: LateInitializationError: Field '_geocodingResult@1248352992' has not been initialized. E/flutter (12031): #0 _MapLocationPickerState._geocodingResult (package:map_location_picker/src/map_location_picker.dart) E/flutter (12031): #1 _MapLocationPickerState.build. (package:map_location_picker/src/map_location_picker.dart:502:48) E/flutter (12031): #2 _MapLocationPickerState.build. (package:map_location_picker/src/map_location_picker.dart:501:38) E/flutter (12031): #3 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:1005:21) E/flutter (12031): #4 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:198:24) E/flutter (12031): #5 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:613:11) E/flutter (12031): #6 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:298:5) E/flutter (12031): #7 BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:269:7) E/flutter (12031): #8 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:157:27) E/flutter (12031): #9 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:449:20) E/flutter (12031): #10 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:425:22) E/flutter (12031): #11 RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:329:11) E/flutter (12031): #12 GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:380:7) E/flutter (12031): #13 GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:344:5) E/flutter (12031): #14 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:302:7) E/flutter (12031): #15 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:285:7) E/flutter (12031): #16 _rootRunUnary (dart:async/zone.dart:1442:13) E/flutter (12031): #17 _CustomZone.runUnary (dart:async/zone.dart:1335:19) E/flutter (12031): #18 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7) E/flutter (12031): #19 _invoke1 (dart:ui/hooks.dart:170:10) E/flutter (12031): #20 PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:331:7) E/flutter (12031): #21 _dispatchPointerDataPacket (dart:ui/hooks.dart:94:31) E/flutter (12031):

    bug good first issue 
    opened by glupeksha 2
  • Sugestion box background

    Sugestion box background

    Congrats for the package!

    I've tried and it works perfect.. but i have a doubt that i can't figure how to solve: The "sugestion box" keeps under the search bar keeps with a transparency that i can't 'remove'.

    image

    How can i define that background color?

    bug 
    opened by DevTiago 2
Releases(1.0.2)
  • 1.0.1(Jul 29, 2022)

    • google_maps_flutter package updated to 2.1.10
    • form_builder_extra_fields package updated to 8.3.0
    • geolocator package updated to 9.0.1
    • Cannot select a location directly after searching in the search bar #5 resolved.
    • LateInitializationError on _geocodingresult #6 resolved.
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(Jul 12, 2022)

    • Remake of the entire project form scratch.
    • Added new features and UI customizations.
    • Added flutter web support.
    • #2 bug fixed.
    • #3 bug fixed.
    • #4 Enhancement has been postponed.
    Source code(tar.gz)
    Source code(zip)
  • 0.0.2(Apr 21, 2022)

Owner
Arvind Sangwan
I'm an ordinary software developer
Arvind Sangwan
Note the place to remember it's name and descriptions along with google map location.

Note the Place Note the place to remember it's name and descriptions along with map location. View in Web Click here for web view Note: for bettter lo

subash kc 4 May 5, 2022
Place picker for Flutter using open street, Here maps and google map

Flutter Place Picker A Flutter plugin which provides 'Picking Place' using Open Street, Here Maps and Google Maps widget. Much thanks to Terry Kwon Th

Samuel Annin Yeboah 15 Oct 27, 2022
A flutter date time picker inspired by flutter-cupertino-date-picker

Flutter Datetime Picker (Pub) flutter_datetime_picker A flutter date time picker inspired by flutter-cupertino-date-picker you can choose date / time

null 0 Nov 30, 2021
Form builder image picker - Form builder image picker for flutter

form_builder_image_picker Field for picking image(s) from Gallery or Camera for

Ferri Sutanto 0 Jan 28, 2022
Nepali date picker - Material Style Date Picker with Bikram Sambat(Nepali) Calendar Support

Nepali Date Picker + Calendar Material and Cupertino Styled Date Picker, Date Range Picker and Calendar with Bikram Sambat(Nepali) Support. Nepali Dat

Sarbagya Dhaubanjar 35 Jan 3, 2023
Community-based vegan groceries map

Plante ?? app Community-based vegan groceries map https://planteapp.com/ ?? Translations We don't speak that many languages - if you would help us to

Plante App 24 Dec 30, 2022
Venda is a location-based business platform

Venda (vendaround.com) Venda is a location-based business platform that enables people to discover businesses around them. With Venda, you can sell or

Ogwal Steven Albert 24 Jul 24, 2022
Declaratively switch child widgets based on the current `Router` location.

Features Declaratively switch child widgets based on the current Router location. class SideBar extends StatelessWidget { Widget build(_){ re

gskinner team 7 Dec 12, 2022
Flutter package to create list of radio button, by providing a list of objects it can be a String list or list of Map.

Custom Radio Group List Flutter package to create list of radio button, by providing a list of objects it can be a String list or list of Map. Feature

Ashok Kumar Verma 0 Nov 30, 2021
A flutter demo app to practice Map data structure and its common operations

Map Operations A flutter demo app to practice Map data structure and its common operations Developer Alexander Sosa (https://www.linkedin.com/in/alexa

Alexander Sosa 0 Jan 3, 2022
The purpose of this project was to test Google Map Services in connection with Flutter on Android, iOS

A large variety of apps depend on map services. The purpose of this project was to test Google Map Services in connection with Flutter on Android, iOS and Web platforms. Here is what I got:

Derek Jones 15 Oct 17, 2022
Customizable heat map interface analysis library

Round Spot Customizable heat map interface analysis library Round Spot simplifies the UI accessibility and behaviour analysis for Flutter applications

Stanisław Góra 31 Dec 12, 2022
FormField to pick one or more locations from open streat map

FormField to pick one or more locations from open streat map Features Pick single location Pick multi locations display open street maps can work with

Mohamed Dawood 13 Dec 15, 2022
dynamic link , notifaction , google map, animated-to

dynamicapp A new Flutter application. Getting Started This project is a starting point for a Flutter application. A few resources to get you started i

Hussein-Sarsour 0 Dec 29, 2021
A simple flutter app that fetches weather data from openweathermap.org depending on your location or city you specify.

Clima ☁ My Goal The objective of this project is to learn about asynchronous programming in Dart. I'll be looking at how to carry out time consuming t

David-Legend 7 Sep 28, 2021
A Flutter plugin to get location updates in the background for both Android and iOS

Background Location A Flutter plugin to get location updates in the background for both Android and iOS (Requires iOS 10.0+). Uses CoreLocation for iO

Ali Almoullim 181 Jan 4, 2023
A Flutter plugin for updating location in background.

background_locator A Flutter plugin for getting location updates even when the app is killed. Refer to wiki page for install and setup instruction or

REKAB 270 Dec 29, 2022
Codeflow 19 Sep 29, 2022
A Funtioning basic Clock UI APP with extra functionalities such as displaying thecurrent time location being used and checking time for other timezones simultaneosly.

clock_UI A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if this

Anjola Favour Ayomikun 0 Dec 28, 2021