91 lines
2.5 KiB
Dart
91 lines
2.5 KiB
Dart
import 'dart:async';
|
|
import 'dart:convert';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:http/http.dart';
|
|
import 'package:sendtrain/models/google_place_model.dart';
|
|
import 'package:sendtrain/widgets/generic/elements/form_search_input.dart';
|
|
import 'package:uuid/uuid.dart';
|
|
|
|
class GooglePlacesService {
|
|
final sessionToken = Uuid().v4();
|
|
final apiKey = "AIzaSyBCjMCEAyyNVpsnVYvZj6VL1mmB98Vd6AE";
|
|
final client = Client();
|
|
|
|
void finish() {
|
|
client.close();
|
|
}
|
|
|
|
Future<List<Suggestion>?> fetchSuggestions(String input) async {
|
|
var headers = {
|
|
'Content-Type': 'application/json',
|
|
'X-Goog-Api-Key': apiKey,
|
|
"Access-Control-Allow-Origin": "*",
|
|
'X-Goog-FieldMask':
|
|
'places.displayName,places.id,places.formattedAddress,places.photos'
|
|
};
|
|
var request = Request('POST',
|
|
Uri.parse('https://places.googleapis.com/v1/places:searchText'));
|
|
request.body = json.encode({"textQuery": input});
|
|
request.headers.addAll(headers);
|
|
|
|
StreamedResponse response = await request.send();
|
|
|
|
if (response.statusCode == 200) {
|
|
final result = json.decode(await response.stream.bytesToString());
|
|
|
|
if (result.isNotEmpty) {
|
|
return result['places']
|
|
.map<Suggestion>((p) => Suggestion<GooglePlaceModel>(
|
|
GooglePlaceModel(
|
|
placeId: p['id'],
|
|
description: p['displayName']['text'],
|
|
address: p['formattedAddress'],
|
|
imageReferences: p['photos'])))
|
|
.toList();
|
|
} else {
|
|
return null;
|
|
}
|
|
} else {
|
|
throw Exception(response.reasonPhrase);
|
|
}
|
|
}
|
|
|
|
Future fetchPhoto(String name) async {
|
|
var headers = {
|
|
"Access-Control-Allow-Origin": "*",
|
|
};
|
|
|
|
var request = Request(
|
|
'GET',
|
|
Uri.parse(
|
|
'https://places.googleapis.com/v1/$name/media?key=$apiKey&maxWidthPx=800&skipHttpRedirect=true'));
|
|
request.headers.addAll(headers);
|
|
|
|
StreamedResponse response = await request.send();
|
|
|
|
if (response.statusCode == 200) {
|
|
final result = json.decode(await response.stream.bytesToString());
|
|
|
|
if (result.isNotEmpty) {
|
|
return result;
|
|
} else {
|
|
return null;
|
|
}
|
|
} else {
|
|
throw Exception(response.reasonPhrase);
|
|
}
|
|
}
|
|
|
|
Widget resultWidget(GooglePlaceModel place, Function? callback) {
|
|
return ListTile(
|
|
title: Text(place.description),
|
|
onTap: () async {
|
|
if (callback != null) {
|
|
callback();
|
|
}
|
|
},
|
|
);
|
|
}
|
|
}
|