map 0.2.0+1 map: ^0.2.0+1 copied to clipboard
Map widget for Flutter written in 100% Dart.
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:latlng/latlng.dart';
import 'package:map/map.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Map Demo',
theme: ThemeData(
primarySwatch: Colors.purple,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final controller = MapController(
location: LatLng(35.68, 51.41),
);
void _gotoDefault() {
controller.center = LatLng(35.68, 51.41);
}
void _onDoubleTap() {
controller.zoom += 0.5;
}
Offset _dragStart;
double _scaleStart = 1.0;
void _onScaleStart(ScaleStartDetails details) {
_dragStart = details.focalPoint;
_scaleStart = 1.0;
}
void _onScaleUpdate(ScaleUpdateDetails details) {
final scaleDiff = details.scale - _scaleStart;
_scaleStart = details.scale;
if (scaleDiff > 0) {
controller.zoom += 0.02;
} else if (scaleDiff < 0) {
controller.zoom -= 0.02;
} else {
final now = details.focalPoint;
final diff = now - _dragStart;
_dragStart = now;
controller.drag(diff.dx, diff.dy);
}
}
@override
Widget build(BuildContext context) {
//final devicePixelRatio = MediaQuery.of(context).devicePixelRatio;
//controller.tileSize = 256 / devicePixelRatio;
return Scaffold(
appBar: AppBar(
title: Text('Map Demo'),
),
body: GestureDetector(
onDoubleTap: _onDoubleTap,
onScaleStart: _onScaleStart,
onScaleUpdate: _onScaleUpdate,
onScaleEnd: (details) {
print(
"Location: ${controller.center.latitude}, ${controller.center.longitude}");
},
child: Stack(
children: [
Map(
controller: controller,
builder: (context, x, y, z) {
final url =
'https://www.google.com/maps/vt/pb=!1m4!1m3!1i$z!2i$x!3i$y!2m3!1e0!2sm!3i420120488!3m7!2sen!5e1105!12m4!1e68!2m2!1sset!2sRoadmap!4e0!5m1!1e0!23i4111425';
return CachedNetworkImage(
imageUrl: url,
fit: BoxFit.cover,
);
},
),
Center(
child: Icon(Icons.close, color: Colors.red),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _gotoDefault,
tooltip: 'My Location',
child: Icon(Icons.my_location),
),
);
}
}