Why i can't print all of List. I was debug the project, every data has map to list but i still can print it out. Please help me.
Here my Screen to show the list
class MapScreen extends StatelessWidget {
const MapScreen({super.key});
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
FutureProvider(
create: (context) => GeolocatorService().getLocation(),
initialData: null,
),
ProxyProvider<Position, Future<List<Place>>>(
update: (context, position, places) {
return PlacesService()
.getPlaces(position.latitude, position.longitude);
},
)
],
child: const MaterialApp(
home: GetScreen(),
),
);
}
}
class GetScreen extends StatelessWidget {
const GetScreen({super.key});
@override
Widget build(BuildContext context) {
final currentPosition = Provider.of<Position?>(context);
if (currentPosition != null) {
final placeService = Provider.of<Future<List<Place>>>(context);
FutureProvider(
create: (context) => placeService,
initialData: const [],
child: Scaffold(
appBar: AppBar(
leading: IconButton(
onPressed: () {
Navigator.pop(context);
},
icon: const Icon(Icons.arrow_back_ios_new_rounded)),
title: const Text('Tìm nhà hàng'),
elevation: 0,
backgroundColor: Colors.purple,
centerTitle: true,
),
// ignore: unnecessary_null_comparison
body: Consumer<List<Place>>(
builder: (context, places, child) {
return Column(
children: <Widget>[
SizedBox(
height: MediaQuery.of(context).size.height / 3,
width: MediaQuery.of(context).size.width,
child: GoogleMap(
initialCameraPosition: CameraPosition(
target: LatLng(currentPosition.latitude,
currentPosition.longitude),
zoom: 16.0),
zoomGesturesEnabled: true,
),
),
const SizedBox(
height: 10.0,
),
Expanded(
child: ListView.builder(
itemCount: places.length,
itemBuilder: (context, index) {
return Card(
child: ListTile(
title: Text(
places[index].name,
),
),
);
}))
],
);
},
)),
);
}
return Scaffold(
appBar: AppBar(
leading: IconButton(
onPressed: () {
Navigator.pop(context);
},
icon: const Icon(Icons.arrow_back_ios_new_rounded)),
title: const Text('Tìm nhà hàng'),
elevation: 0,
backgroundColor: Colors.purple,
centerTitle: true,
),
body: const Center(child: CircularProgressIndicator()));
}
}
Here my code to get data and map them to list. After the code map data to list done, i didn't see the code comeback to MapScreen().
class PlacesService {
final key = 'AIzaSyDM32Kzq-Pz_MPorUAYxWgDX7qb3nt2S6M';
Future<List<Place>> getPlaces(double lat, double lng) async {
var response = await http.get(Uri.parse(
'https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=$lat,$lng&type=restaurant&rankby=distance&key=$key '));
var json = convert.jsonDecode(response.body);
var jsonResults = json['results'] as List;
return jsonResults.map((place) => Place.fromJson(place)).toList();
}
}
class Place {
final Geometry geometry;
final String name;
final double rating;
final int userRatingCount;
final String vicinity;
Place(this.geometry, this.name, this.rating, this.userRatingCount,
this.vicinity);
Place.fromJson(Map<dynamic, dynamic> parsedJson)
: geometry = Geometry.fromJson(parsedJson['geometry']),
name = parsedJson['name'],
rating = (parsedJson['rating'] != null)
? (parsedJson['rating'])!.toDouble()
: 0.0,
userRatingCount = (parsedJson['user_ratings_total'] != null)
? parsedJson['user_ratings_total']
: 0,
vicinity = parsedJson['vicinity'];
}
And the Screen is return Center(child: CircularProgressIndicator())) all the time.
CodePudding user response:
You forgot return
:
if (currentPosition != null) {
final placeService = Provider.of<Future<List<Place>>>(context);
return FutureProvider( // Add return there