added stuff
This commit is contained in:
parent
a655c789bc
commit
6cfa24f1e3
15
.metadata
15
.metadata
|
@ -15,24 +15,9 @@ migration:
|
|||
- platform: root
|
||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
- platform: android
|
||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
- platform: ios
|
||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
- platform: linux
|
||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
- platform: macos
|
||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
- platform: web
|
||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
- platform: windows
|
||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
||||
|
||||
# User provided section
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -12,21 +12,21 @@ class HomeScreen extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _HomeScreenState extends State<HomeScreen> {
|
||||
List _stations = [];
|
||||
List _schedule = [];
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_getStations();
|
||||
_getSchedule();
|
||||
}
|
||||
|
||||
Future<void> _getStations() async {
|
||||
final String stationFile =
|
||||
await rootBundle.loadString("assets/data/stations.json");
|
||||
final data = await json.decode(stationFile);
|
||||
Future<void> _getSchedule() async {
|
||||
final String scheduleFile =
|
||||
await rootBundle.loadString("assets/data/schedule.json");
|
||||
final data = await json.decode(scheduleFile);
|
||||
|
||||
setState(() {
|
||||
_stations = data["records"];
|
||||
_schedule = data["records"];
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
|||
body: Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10.0),
|
||||
child: ListView.builder(
|
||||
itemCount: _stations.length,
|
||||
itemCount: _schedule.length,
|
||||
itemBuilder: (context, index) {
|
||||
return Card(
|
||||
elevation: 4.0,
|
||||
|
@ -64,19 +64,19 @@ class _HomeScreenState extends State<HomeScreen> {
|
|||
TextSpan(text: "เลขขบวน"),
|
||||
TextSpan(text: "\n"),
|
||||
TextSpan(
|
||||
text: _stations[index][1],
|
||||
text: _schedule[index][1],
|
||||
style: TextStyle(
|
||||
fontSize: 20, fontWeight: FontWeight.bold)),
|
||||
])),
|
||||
title: Text(_stations[index][2]),
|
||||
title: Text(_schedule[index][2]),
|
||||
subtitle: RichText(
|
||||
text: TextSpan(
|
||||
children: <TextSpan>[
|
||||
TextSpan(text: "Arrival: "),
|
||||
TextSpan(text: _stations[index][8]),
|
||||
TextSpan(text: _schedule[index][8]),
|
||||
TextSpan(text: "\n"),
|
||||
TextSpan(text: "Departure: "),
|
||||
TextSpan(text: _stations[index][9])
|
||||
TextSpan(text: _schedule[index][9])
|
||||
],
|
||||
)),
|
||||
));
|
||||
|
|
|
@ -1,4 +1,16 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
import 'package:flutter_map/plugin_api.dart';
|
||||
import 'package:flutter_map_animations/flutter_map_animations.dart';
|
||||
import 'package:flutter_map_supercluster/flutter_map_supercluster.dart';
|
||||
import 'package:latlong2/latlong.dart';
|
||||
|
||||
void main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
}
|
||||
|
||||
class MapScreen extends StatefulWidget {
|
||||
const MapScreen({Key? key}) : super(key: key);
|
||||
|
@ -7,7 +19,47 @@ class MapScreen extends StatefulWidget {
|
|||
State<MapScreen> createState() => _MapScreenState();
|
||||
}
|
||||
|
||||
class _MapScreenState extends State<MapScreen> {
|
||||
class _MapScreenState extends State<MapScreen> with TickerProviderStateMixin {
|
||||
late List _stations = [];
|
||||
late final List<Marker> markers;
|
||||
late final SuperclusterImmutableController _superclusterController;
|
||||
late final AnimatedMapController _animatedMapController;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_superclusterController = SuperclusterImmutableController();
|
||||
_animatedMapController = AnimatedMapController(vsync: this);
|
||||
|
||||
markers = [];
|
||||
|
||||
for (var i = 0; i < _stations.length; i++) {
|
||||
final latLng =
|
||||
LatLng(double.parse(_stations[i][4]), double.parse(_stations[i][5]));
|
||||
|
||||
markers.add(
|
||||
Marker(
|
||||
anchorPos: AnchorPos.align(AnchorAlign.top),
|
||||
rotateAlignment: AnchorAlign.top.rotationAlignment,
|
||||
height: 30,
|
||||
width: 30,
|
||||
point: latLng,
|
||||
builder: (ctx) => const Icon(Icons.pin_drop),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _getStations() async {
|
||||
final String stationFile =
|
||||
await rootBundle.loadString("assets/data/stations.json");
|
||||
final data = await json.decode(stationFile);
|
||||
|
||||
setState(() {
|
||||
_stations = data["records"];
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
|
@ -25,6 +77,64 @@ class _MapScreenState extends State<MapScreen> {
|
|||
),
|
||||
floatingActionButton: FloatingActionButton(
|
||||
onPressed: () => {print("deez")}, child: const Icon(Icons.add)),
|
||||
body: FlutterMap(
|
||||
mapController: _animatedMapController.mapController,
|
||||
options: MapOptions(
|
||||
// center: LatLng((maxLatLng.latitude + minLatLng.latitude) / 2,
|
||||
// (maxLatLng.longitude + minLatLng.longitude) / 2),
|
||||
zoom: 6,
|
||||
maxZoom: 15,
|
||||
),
|
||||
nonRotatedChildren: [
|
||||
Builder(
|
||||
builder: (context) =>
|
||||
Text(FlutterMapState.maybeOf(context)!.zoom.toString()),
|
||||
)
|
||||
],
|
||||
children: <Widget>[
|
||||
TileLayer(
|
||||
urlTemplate: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
|
||||
subdomains: const ['a', 'b', 'c'],
|
||||
),
|
||||
SuperclusterLayer.immutable(
|
||||
initialMarkers: markers,
|
||||
indexBuilder: IndexBuilders.computeWithOriginalMarkers,
|
||||
controller: _superclusterController,
|
||||
moveMap: (center, zoom) => _animatedMapController.animateTo(
|
||||
dest: center,
|
||||
zoom: zoom,
|
||||
),
|
||||
calculateAggregatedClusterData: true,
|
||||
clusterWidgetSize: const Size(40, 40),
|
||||
anchor: AnchorPos.align(AnchorAlign.center),
|
||||
popupOptions: PopupOptions(
|
||||
selectedMarkerBuilder: (context, marker) => const Icon(
|
||||
Icons.pin_drop,
|
||||
color: Colors.red,
|
||||
),
|
||||
popupDisplayOptions: PopupDisplayOptions(
|
||||
builder: (BuildContext context, Marker marker) => Container(
|
||||
color: Colors.white,
|
||||
child: Text(marker.point.toString()),
|
||||
),
|
||||
),
|
||||
),
|
||||
builder: (context, position, markerCount, extraClusterData) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(20.0),
|
||||
color: Colors.blue),
|
||||
child: Center(
|
||||
child: Text(
|
||||
markerCount.toString(),
|
||||
style: const TextStyle(color: Colors.white),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,6 +39,10 @@ dependencies:
|
|||
flutter_localization: ^0.2.2
|
||||
gestures: ^1.0.0
|
||||
path_provider: ^2.1.4
|
||||
flutter_map: any
|
||||
latlong2: any
|
||||
flutter_map_supercluster: any
|
||||
flutter_map_animations: any
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
@ -64,6 +68,7 @@ flutter:
|
|||
|
||||
# To add assets to your application, add an assets section, like this:
|
||||
assets:
|
||||
- assets/data/schedule.json
|
||||
- assets/data/stations.json
|
||||
# - images/a_dot_ham.jpeg
|
||||
|
||||
|
|
Loading…
Reference in New Issue