Add location search interface

This commit is contained in:
Vishnu Mohandas 2020-06-03 18:48:55 +05:30
parent aebcf9cbfa
commit 768afb10db
3 changed files with 98 additions and 10 deletions

View file

@ -1,4 +1,6 @@
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:photos/core/configuration.dart';
import 'package:photos/face_search_manager.dart';
import 'package:photos/models/face.dart';
@ -6,22 +8,58 @@ import 'package:photos/ui/circular_network_image_widget.dart';
import 'package:photos/ui/face_search_results_page.dart';
import 'package:photos/ui/loading_widget.dart';
class SearchPage extends StatelessWidget {
class SearchPage extends StatefulWidget {
@override
_SearchPageState createState() => _SearchPageState();
}
class _SearchPageState extends State<SearchPage> {
final FaceSearchManager _faceSearchManager = FaceSearchManager.instance;
String _searchString = "";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: TextField(
autofocus: true,
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'Search your photos',
contentPadding: const EdgeInsets.all(0.0),
title: TypeAheadField(
textFieldConfiguration: TextFieldConfiguration(
autofocus: true,
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'Search your photos',
contentPadding: const EdgeInsets.all(0.0),
),
),
hideOnEmpty: true,
hideOnLoading: true,
loadingBuilder: (context) {
return loadWidget;
},
debounceDuration: Duration(milliseconds: 100),
suggestionsCallback: (pattern) async {
if (pattern.isEmpty) {
return null;
}
return (await Dio().get(
"https://maps.googleapis.com/maps/api/place/textsearch/json",
queryParameters: {
"query": pattern,
"key": "AIzaSyC9lAYIERrNFsCkdLxX6DmZfPhybTKod8U",
}))
.data["results"];
},
itemBuilder: (context, suggestion) {
if (suggestion == null) {
return null;
}
return LocationSearchResultWidget(suggestion['name']);
},
onSuggestionSelected: (suggestion) {
// Navigator.of(context).push(MaterialPageRoute(
// builder: (context) => ProductPage(product: suggestion)));
},
),
actions: <Widget>[
// action button
IconButton(
icon: Icon(Icons.search),
onPressed: () {},
@ -29,7 +67,7 @@ class SearchPage extends StatelessWidget {
],
),
body: Container(
child: _getSearchSuggestions(),
child: _searchString.isEmpty ? _getSearchSuggestions() : Container(),
),
);
}
@ -82,3 +120,38 @@ class SearchPage extends StatelessWidget {
);
}
}
class LocationSearchResultWidget extends StatelessWidget {
final String name;
const LocationSearchResultWidget(
this.name, {
Key key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
padding: new EdgeInsets.symmetric(vertical: 6.0, horizontal: 6.0),
margin: EdgeInsets.symmetric(vertical: 6.0),
child: Column(children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Icon(
Icons.location_on,
),
Padding(padding: EdgeInsets.only(left: 20.0)),
Flexible(
child: Container(
child: Text(
name,
overflow: TextOverflow.clip,
),
),
),
],
),
]),
);
}
}

View file

@ -139,6 +139,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.8"
flutter_keyboard_visibility:
dependency: transitive
description:
name: flutter_keyboard_visibility
url: "https://pub.dartlang.org"
source: hosted
version: "0.7.0"
flutter_launcher_icons:
dependency: "direct dev"
description:
@ -151,6 +158,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_typeahead:
dependency: "direct main"
description:
name: flutter_typeahead
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.1"
flutter_web_plugins:
dependency: transitive
description: flutter

View file

@ -47,6 +47,7 @@ dependencies:
like_button: ^0.2.0
logging: ^0.11.4
flutter_image_compress: ^0.6.5+1
flutter_typeahead: ^1.8.1
dev_dependencies:
flutter_test: