Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e25abe9

Browse files
Add find-friends page
1 parent 15314a1 commit e25abe9

File tree

2 files changed

+172
-1
lines changed

2 files changed

+172
-1
lines changed

‎lib/main.dart‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ import 'dart:async';
22

33
import 'package:custom_info_window/custom_info_window.dart';
44
import 'package:day41/model/map_style.dart';
5+
import 'package:day41/pages/find_friends.dart';
56
import 'package:flutter/foundation.dart';
67
import 'package:flutter/material.dart';
78
import 'package:google_maps_flutter/google_maps_flutter.dart';
89

910
void main() {
1011
runApp(const MaterialApp(
11-
home: HomePage(),
12+
home: FindFriends(),
1213
debugShowCheckedModeBanner: false,
1314
));
1415
}

‎lib/pages/find_friends.dart‎

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
import 'dart:async';
2+
import 'dart:typed_data';
3+
import 'dart:ui';
4+
5+
import 'package:day41/model/map_style.dart';
6+
import 'package:flutter/material.dart';
7+
import 'package:flutter/rendering.dart';
8+
import 'package:flutter/services.dart';
9+
import 'package:google_maps_flutter/google_maps_flutter.dart';
10+
11+
class FindFriends extends StatefulWidget {
12+
const FindFriends({ Key? key }) : super(key: key);
13+
14+
@override
15+
_FindFriendsState createState() => _FindFriendsState();
16+
}
17+
18+
class _FindFriendsState extends State<FindFriends> {
19+
static final CameraPosition _kGooglePlex = CameraPosition(
20+
target: LatLng(37.42796133580664, -122.085749655962),
21+
zoom: 14.4746,
22+
);
23+
24+
Set<Marker> _markers = {};
25+
late GoogleMapController _controller;
26+
27+
List<dynamic> _contacts = [
28+
{
29+
"name": "Me",
30+
"position": LatLng(37.42796133580664, -122.085749655962),
31+
"marker": 'assets/markers/marker-1.png',
32+
"image": 'assets/images/avatar-1.png',
33+
},
34+
{
35+
"name": "Samantha",
36+
"position": LatLng(37.42484642575639, -122.08309359848501),
37+
"marker": 'assets/markers/marker-2.png',
38+
"image": 'assets/images/avatar-2.png',
39+
},
40+
{
41+
"name": "Malte",
42+
"position": LatLng(37.42381625902441, -122.0928531512618),
43+
"marker": 'assets/markers/marker-3.png',
44+
"image": 'assets/images/avatar-3.png',
45+
},
46+
{
47+
"name": "Julia",
48+
"position": LatLng(37.41994095849639, -122.08159055560827),
49+
"marker": 'assets/markers/marker-4.png',
50+
"image": 'assets/images/avatar-4.png',
51+
},
52+
{
53+
"name": "Tim",
54+
"position": LatLng(37.413175077529935, -122.10101041942836),
55+
"marker": 'assets/markers/marker-5.png',
56+
"image": 'assets/images/avatar-5.png',
57+
},
58+
{
59+
"name": "Sara",
60+
"position": LatLng(37.419013242401576, -122.11134664714336),
61+
"marker": 'assets/markers/marker-6.png',
62+
"image": 'assets/images/avatar-6.png',
63+
},
64+
{
65+
"name": "Ronaldo",
66+
"position": LatLng(37.40260962243491, -122.0976958796382),
67+
"marker": 'assets/markers/marker-7.png',
68+
"image": 'assets/images/avatar-7.png',
69+
},
70+
];
71+
72+
@override
73+
void initState() {
74+
super.initState();
75+
}
76+
77+
@override
78+
Widget build(BuildContext context) {
79+
createMarkers(context);
80+
81+
return Scaffold(
82+
body: Stack(
83+
children: [
84+
GoogleMap(
85+
initialCameraPosition: _kGooglePlex,
86+
markers: _markers,
87+
myLocationButtonEnabled: false,
88+
onMapCreated: (GoogleMapController controller) {
89+
_controller = controller;
90+
controller.setMapStyle(MapStyle().aubergine);
91+
},
92+
),
93+
Positioned(
94+
bottom: 50,
95+
left: 20,
96+
right: 20,
97+
child: Container(
98+
width: MediaQuery.of(context).size.width,
99+
height: 120,
100+
decoration: BoxDecoration(
101+
color: Colors.white,
102+
borderRadius: BorderRadius.circular(20)
103+
),
104+
child: ListView.builder(
105+
scrollDirection: Axis.horizontal,
106+
itemCount: _contacts.length,
107+
itemBuilder: (context, index) {
108+
return GestureDetector(
109+
onTap: () {
110+
_controller.moveCamera(CameraUpdate.newLatLng(_contacts[index]["position"]));
111+
},
112+
child: Container(
113+
width: 100,
114+
height: 100,
115+
margin: EdgeInsets.only(right: 10),
116+
child: Column(
117+
mainAxisAlignment: MainAxisAlignment.center,
118+
children: [
119+
Image.asset(_contacts[index]['image'], width: 60,),
120+
SizedBox(height: 10,),
121+
Text(_contacts[index]["name"], style: TextStyle(color: Colors.black, fontWeight: FontWeight.w600),)
122+
],
123+
),
124+
),
125+
);
126+
},
127+
)
128+
),
129+
)
130+
],
131+
)
132+
);
133+
}
134+
135+
createMarkers(BuildContext context) {
136+
Marker marker;
137+
138+
_contacts.forEach((contact) async {
139+
marker = Marker(
140+
markerId: MarkerId(contact['name']),
141+
position: contact['position'],
142+
icon: await _getAssetIcon(context, contact['marker']).then((value) => value),
143+
infoWindow: InfoWindow(
144+
title: contact['name'],
145+
snippet: 'Street 6 . 2min ago',
146+
),
147+
);
148+
149+
setState(() {
150+
_markers.add(marker);
151+
});
152+
});
153+
}
154+
155+
Future<BitmapDescriptor> _getAssetIcon(BuildContext context, String icon) async {
156+
final Completer<BitmapDescriptor> bitmapIcon = Completer<BitmapDescriptor>();
157+
final ImageConfiguration config = createLocalImageConfiguration(context, size: Size(5, 5));
158+
159+
AssetImage(icon)
160+
.resolve(config)
161+
.addListener(ImageStreamListener((ImageInfo image, bool sync) async {
162+
final ByteData? bytes = await image.image.toByteData(format: ImageByteFormat.png);
163+
final BitmapDescriptor bitmap = BitmapDescriptor.fromBytes(bytes!.buffer.asUint8List());
164+
bitmapIcon.complete(bitmap);
165+
})
166+
);
167+
168+
return await bitmapIcon.future;
169+
}
170+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /