Untitled

 avatar
unknown
plain_text
2 years ago
2.8 kB
3
Indexable
import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

class MapScreen extends StatefulWidget {
  @override
  _MapScreenState createState() => _MapScreenState();
}

class _MapScreenState extends State<MapScreen> {
  static const LatLng _initialLocation = const LatLng(0.0, 0.0);
  GoogleMapController _mapController;
  Set<Marker> _markers = {};
  LatLngBounds _bounds;

  // Inisialisasi lokasi pengguna sebagai lokasi di luar batas titik koordinat API
  LatLng _userLocation = const LatLng(0.0, 0.0);

  @override
  void initState() {
    super.initState();
    _fetchMarkers();
    _getCurrentLocation();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Peta'),
      ),
      body: GoogleMap(
        onMapCreated: _onMapCreated,
        initialCameraPosition: CameraPosition(
          target: _initialLocation,
          zoom: 15.0,
        ),
        markers: _markers,
      ),
    );
  }

  void _onMapCreated(GoogleMapController controller) {
    _mapController = controller;
  }

  Future<void> _fetchMarkers() async {
    final response = await http.get(
      Uri.parse('https://api.example.com/markers'),
    );

    if (response.statusCode == 200) {
      final data = jsonDecode(response.body);
      final latLngList = List<LatLng>.from(
        data.map((item) => LatLng(item['lat'], item['lng'])),
      );

      // Set _bounds dengan batas titik koordinat dari API
      _bounds = LatLngBounds(
        southwest: latLngList.first,
        northeast: latLngList.last,
      );

      // Tambahkan penanda ke _markers
      for (final latLng in latLngList) {
        _markers.add(
          Marker(
            markerId: MarkerId(latLng.toString()),
            position: latLng,
          ),
        );
      }
    }
  }

  Future<void> _getCurrentLocation() async {
    final currentPosition = await Geolocator.getCurrentPosition();

    // Jika pengguna berada di dalam batas titik koordinat, update _userLocation dengan lokasi saat ini
    if (_bounds.contains(LatLng(
          currentPosition.latitude,
          currentPosition.longitude,
        ))) {
      setState(() {
        _userLocation = LatLng(
          currentPosition.latitude,
          currentPosition.longitude,
        );
      });
    } else {
      // Jika pengguna berada di luar batas titik koordinat, kembalikan tampilan kamera ke dalam batas
      _mapController.animateCamera(
        CameraUpdate.newLatLngBounds(_bounds, 0),
      );
    }
  }
}
Editor is loading...