es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

TypeError (el tipo ‘Null’ no es un subtipo del tipo ‘FutureOr‘)

Recientemente instalé Flutter “null safety” y después de corregir la mayor parte del código, tengo problemas con una llamada a la API.

Devuelve “_TypeError (el tipo ‘Null’ no es un subtipo del tipo ‘FutureOr‘)”.

No encontré una respuesta en SO que parezca coincidir con mi problema/metodo de código.

Este es el botón de clic que llama a la API desde main.dart

void _anchoredMapMarkersButtonClicked() {
    _mapMarkerExample.showAnchoredMapMarkers();
}

Y esta es la llamada a la API en sí con el error que se muestra en la línea de abajo “} catch(Exception) {

Future<estaciones> fetchStations() async {
    var cliente = http.Client();
    var estaciones;

    Position posicion = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);

    var lat = posicion.latitude;
    var long = posicion.longitude;

    try {
        var respuesta = await cliente.get(Uri.parse('llamada de https'));
        if (respuesta.statusCode == 200) {
            var cadenaJson = respuesta.body;
            var mapaJson = json.decode(cadenaJson);

            estaciones = Estaciones.fromJson(mapaJson);
        }
    } catch (e) {
        return estaciones;
    }

    return estaciones;
}

Código actualizado

“`dart
Future<estaciones> fetchStations() async {
var cliente = http.Client();
Estaciones? estaciones;

<pre><code>Position posicion = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
print(posicion);

var lat = posicion.latitude;
var long = posicion.longitude;

try {
var respuesta = await cliente.get(Uri.parse('https://transit.hereapi.com/v8/stations?in=$lat,$long&return=transport&apiKey=uIioesb_EbnEXgPHlH0Z5e7gPGy9irpq2dRJcjuYPZY'));
if (respuesta.statusCode == 200) {
var cadenaJson = respuesta.body;
var mapaJson = json.decode(cadenaJson);
inspect(mapaJson);

estaciones = Estaciones.fromJson(mapaJson);
}
} catch (e) {
Future<estaciones?> fetchStations();
}

return estaciones;
</code></pre>

}
“`</estaciones?>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Después de instalar Flutter null safety, estás teniendo problemas con una llamada a la API que devuelve el error _TypeError (el tipo 'Null' no es un subtipo del tipo 'FutureOr<stations>').

    Al analizar tu código, parece que el problema puede estar relacionado con el hecho de que la variable stations se está declarando sin un valor inicial, y luego se devuelve en el bloque catch en caso de que se produzca una excepción.

    Para solucionar este problema, puedes declarar la variable stations como anulable (Stations?) y devolver null en el bloque catch. Tu código actualizado debería verse algo como esto:

    Future<stations?> fetchStations() async {
        var client = http.Client();
        Stations? stations;
    
        Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
        print(position);
    
        var lat = position.latitude;
        var long = position.longitude;
    
        try {
            var response = await client.get(Uri.parse('https://transit.hereapi.com/v8/stations?in=$lat,$long&return=transport&apiKey=uIioesb_EbnEXgPHlH0Z5e7gPGy9irpq2dRJcjuYPZY'));
            if (response.statusCode == 200) {
                var jsonString = response.body;
                var jsonMap = json.decode(jsonString);
                //print(jsonMap);
                inspect(jsonMap);
    
                stations = Stations.fromJson(jsonMap);
                //print(stations);
            }
        } catch(Exception) {
            return null;
        }
    
        return stations;
    }
    

    Al declarar stations como anulable y devolver null en el bloque catch, te aseguras de que la función siempre devuelva un valor del tipo correcto (Future<stations?>). Esto debería solucionar el error _TypeError que estás viendo.</stations?></stations?>

Comments are closed.