forui_place_picker_google 1.0.2 copy "forui_place_picker_google: ^1.0.2" to clipboard
forui_place_picker_google: ^1.0.2 copied to clipboard

ForUI 0.25 place picker for Google Maps, written in Dart for Flutter.

example/lib/main.dart

import 'dart:io' show Platform;

import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_config/flutter_config.dart';
import 'package:forui/forui.dart';
import 'package:forui_place_picker_google/forui_place_picker_google.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  if (!kIsWeb) {
    await FlutterConfig.loadEnvVariables();
  }

  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    return WidgetsApp(
      color: const Color(0xFF171717),
      debugShowCheckedModeBanner: false,
      localizationsDelegates: FLocalizations.localizationsDelegates,
      supportedLocales: FLocalizations.supportedLocales,
      pageRouteBuilder: <T>(RouteSettings settings, WidgetBuilder builder) {
        return PageRouteBuilder<T>(
          settings: settings,
          pageBuilder: (context, animation, secondaryAnimation) =>
              builder(context),
        );
      },
      builder: (context, child) => FTheme(
        data: FTheme.neutral.light.touch,
        child: child ?? const SizedBox.shrink(),
      ),
      home: const GooglePlacePickerExample(),
    );
  }
}

class GooglePlacePickerExample extends StatefulWidget {
  const GooglePlacePickerExample({super.key});

  @override
  State<GooglePlacePickerExample> createState() =>
      _GooglePlacePickerExampleState();
}

class _GooglePlacePickerExampleState extends State<GooglePlacePickerExample> {
  GoogleMapController? mapController;
  bool _useFreeGeocoding = false;

  @override
  Widget build(BuildContext context) {
    return FScaffold(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          FSwitch(
            label: const Text('Use Free Geocoding'),
            value: _useFreeGeocoding,
            onChange: (value) {
              setState(() {
                _useFreeGeocoding = value;
              });
            },
          ),
          const SizedBox(height: 16),
          FButton(
            onPress: showPlacePicker,
            child: const Text('Pick Delivery location'),
          ),
        ],
      ),
    );
  }

  void showPlacePicker() {
    Navigator.of(context).push(
      PageRouteBuilder(
        pageBuilder: (context, animation, secondaryAnimation) {
          return PlacePicker(
            useFreeGeocoding: _useFreeGeocoding,
            mapsBaseUrl: kIsWeb
                ? 'https://cors-anywhere.herokuapp.com/https://maps.googleapis.com/maps/api/'
                : 'https://maps.googleapis.com/maps/api/',
            usePinPointingSearch: true,
            apiKey: kIsWeb
                ? 'GOOGLE_MAPS_API_KEY_WEB'
                : Platform.isAndroid
                    ? FlutterConfig.get('GOOGLE_MAPS_API_KEY_ANDROID')
                    : FlutterConfig.get('GOOGLE_MAPS_API_KEY_IOS'),
            onPlacePicked: (LocationResult result) {
              debugPrint('Place picked: ${result.formattedAddress}');
              Navigator.of(context).pop();
            },
            enableNearbyPlaces: false,
            showSearchInput: true,
            initialLocation: const LatLng(29.378586, 47.990341),
            myLocationEnabled: true,
            myLocationButtonEnabled: true,
            onMapCreated: (controller) {
              mapController = controller;
            },
            searchInputConfig: const SearchInputConfig(
              padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
              autofocus: false,
              textDirection: TextDirection.ltr,
            ),
            searchInputDecorationConfig: const SearchInputDecorationConfig(
              hintText: 'Search for a building, street or ...',
            ),
            autocompletePlacesSearchRadius: 150,
          );
        },
      ),
    );
  }
}