Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

The return type 'Object' isn't a 'Future<Iterable<Suggestion>>', as required by the closure's context

I’m using the new dart version <2.18.1> with null safety enabled.
And I’m using the android studio to code this.

This is maps_screen.dart

`

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:geolocator/geolocator.dart';
import 'package:gmapsdemo/places_api.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

class MapsScreen extends StatefulWidget {
  MapsScreen({Key? key}) : super(key : key);

  @override
  _MapsScreenState createState() => _MapsScreenState();
}

class _MapsScreenState extends State<MapsScreen> {

  final Completer<GoogleMapController> _controller = Completer();

  static const LatLng _initialPosition = LatLng(6.8747747, 79.8645194);

  final Set<Marker> _markers = {};

  late LatLng user_current_position;

  MapType currentMapType = MapType.normal;

  TextEditingController _addressController = TextEditingController();

  void _onMapCreate(GoogleMapController controller)
  {
    _controller.complete(controller);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Map Screen'),
      ),
      body: Stack(
        children: [
          Container(
            child: GoogleMap(
              onMapCreated: _onMapCreate,
              initialCameraPosition:
              CameraPosition(target: _initialPosition, zoom: 9),
              markers: _markers,
              onTap: (latLng){

                _onAddMaker(latLng);
              },
              mapType: currentMapType,
              ),
            ),
          Positioned(
            child: Container(
              margin: EdgeInsets.only(top: 10, left: 10, right: 10),
              height: 50,
              decoration: BoxDecoration(
                color: Colors.white,
                borderRadius: BorderRadius.circular(8),
                boxShadow: [
                  BoxShadow(
                    color: Colors.black.withOpacity(0.2),
                    spreadRadius: 3,
                    blurRadius: 2,)
                ]),

              child: TypeAheadField<Suggestion>(
                textFieldConfiguration: TextFieldConfiguration(
                    controller: _addressController,
                    decoration: InputDecoration(
                      alignLabelWithHint: true,
                      hintText: 'Type Address',
                      border: InputBorder.none,
                      hintStyle: TextStyle(fontSize: 20),
                      isCollapsed: true),
                ),
                hideOnEmpty: true,
                hideOnLoading: true,
                suggestionsCallback: (pattern) async {
                  return //await PlacesAPIProvider('23456')
                      .fetchSuggestions(pattern);//
                },
                itemBuilder: (context, suggestion) {
                  return GestureDetector(
                    onTap: (){},
                    child: ListTile(
                      title: Text(suggestion.description,
                      style: TextStyle(color: Colors.black)),
                    ),
                  );
                },
                onSuggestionSelected: (selectedSuggestion) {},
              ),
            ),
          ),
          Positioned(
            bottom: 8,
            left: 8,
            child: FloatingActionButton(
              child: Icon(
                Icons.my_location,
                color: Colors.white,
              ),
              onPressed: () async{

                await getUserCurrentPosition().then((value) async{
                  await _navigateCameraToPosition(value);
                });

              },
            )),
          Positioned(
              bottom: 8,
              left: 80,
              child: FloatingActionButton(
                child: Icon(
                  Icons.map,
                  color: Colors.white,
                ),
                onPressed: (){
                  setState(() {

                    currentMapType = (currentMapType == MapType) ?
                    MapType.satellite : MapType.normal;
                  });
                },
              ))
        ],
      ),
    );
  }

  void _onAddMaker(LatLng position)
  {
    setState(() {

      _markers.add(
          Marker(
              icon: BitmapDescriptor.defaultMarker,
              markerId: MarkerId(position.longitude.toString()),
              position: position,
              infoWindow: InfoWindow(
                  title: "Maker",
                  snippet: position.toString())
          )
      );
    });
  }

  Future<LatLng> getUserCurrentPosition() async
  {

    var position = await  Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.best
    );

    setState(() {
      user_current_position = LatLng(position.latitude, position.longitude);
    });

    return user_current_position;
  }

  Future _navigateCameraToPosition(LatLng position) async
  {
    final controller = await _controller.future;
    
    await controller.animateCamera(CameraUpdate.newCameraPosition(
      CameraPosition(target: position , zoom: 12)
    ));

  }
}

`

This is places_api.dart

import 'dart:convert';

import 'package:http/http.dart' as http;

class PlacesAPIProvider{

  final sessionToken;

  PlacesAPIProvider(this.sessionToken);

  final apiKey = 'AIzaSyCSmS579erjjuZFo3WB8vSL_d5T6nGzFA0';

  Future<Object> fetchSuggestions(String query)
  async {
    if( query.isNotEmpty){

      final request = 'https://maps.googleapis.com/maps/api/place/autocomplete/json'
          'input=$query&types=address&language=en&components=cpuntry:sl'
          '&key=$apiKey&sessointoken=$sessionToken';

      final response = await http.get(Uri.parse(request));

      if(response.statusCode == 200)
      {
        final result = json.decode(response.body);

        if (result['status'] == 'ok')
          {
            return result['predications']
                .map<Suggestion>(
                    (p) => Suggestion( p['place_id'], p['description']))
                .toList();
          }else{

          return [];
        }
      }
      else{
        return [];
      }
    }
    else{
      return [];
    }
    return '';
  }
}

class Suggestion{

  final String placeId;
  final String description;

  Suggestion( this.placeId , this.description);
}

I’m getting this error

The return type 'Object' isn't a 'Future<Iterable<Suggestion>>', as required by the closure's context.

This is where the error is. i put // where the red underline is.

hideOnEmpty: true,
                hideOnLoading: true,
                suggestionsCallback: (pattern) async {
                  return //await PlacesAPIProvider('23456')
                      .fetchSuggestions(pattern);//
                },

and this error in the Run log:

lib/maps_screen.dart:84:26: Error: A value of type 'Object' can't be returned from an async function with return type 'Future<Iterable<Suggestion>>'.
 - 'Object' is from 'dart:core'.
 - 'Future' is from 'dart:async'.
 - 'Iterable' is from 'dart:core'.
 - 'Suggestion' is from 'package:gmapsdemo/places_api.dart' ('lib/places_api.dart').
                  return await PlacesAPIProvider('23456')
                         ^


FAILURE: Build failed with an exception.

* Where:
Script 'C:\Users\induw\Documents\flutter\Flutter\flutter_windows_3.3.2-stable\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 1159

* What went wrong:
Execution failed for task ':app:compileFlutterBuildDebug'.
> Process 'command 'C:\Users\induw\Documents\flutter\Flutter\flutter_windows_3.3.2-stable\flutter\bin\flutter.bat'' finished with non-zero exit value 1

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 1m 42s
Exception: Gradle task assembleDebug failed with exit code 1

Please help me I’m a beginner.

I tried google but I couldn’t find a similar error.

>Solution :

The return type of fetchSuggestions is List<Suggestion> and not Object.
So, change this line.

/// replace Object with Future<Iterable<Suggestion>>
Future<Future<Iterable<Suggestion>>> fetchSuggestions(String query) async{}

More optimal way:

    Future<Future<List<Suggestion>>> fetchSuggestions(String query) async{}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading