【问题标题】:Flutter rest api all my data is showing nullFlutter rest api 我的所有数据都显示为空
【发布时间】:2022-01-03 00:30:02
【问题描述】:

我正在学习使用 api,我的界面中的所有数据都显示为 null

在本节中以了解我改变的问题所在!与?

拉取数据时如何检查是否有问题?

我删除了不相关的部分以缩短代码。

  WeatherApiClient client = WeatherApiClient();
  Hava? data;

  Future<void> getData()async{
    data = await client.getCurrentWeather("London");
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(  
        body: FutureBuilder(
          future: getData(),
          builder: (context, snapshot){
            if(snapshot.connectionState==ConnectionState.done){
              return Column(
                children: [
                  GuncelVeri(Icons.wb_sunny_rounded, "${data?.derece}", "${data?.sehir}"),
                  bilgiler("${data?.humidity}","${data?.feels_like}", "${data?.pressure}","${data?.description}"),],
              );

            }
            else if(snapshot.connectionState == ConnectionState.waiting){
              return Center(
                child: CircularProgressIndicator(),
              );
            }
            return Container();
          },
        )

      ),
    );
  }
}
import 'dart:convert';

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

class WeatherApiClient{
  Future<Hava>? getCurrentWeather(String? location)async{
    var endpoint = Uri.parse(
      "https://api.openweathermap.org/data/2.5/weather?q=$location&appid=9b6ece44d1233c111b86cacb5e3617f1&units=metric&lang=tr"
    );
    var response = await http.get(endpoint);
    var body = jsonDecode(response.body);
    print(Hava.fromJson(body));
    return Hava.fromJson(body);
}
}

【问题讨论】:

  • 先尝试print(body)看看响应是否为空
  • try catch 等用户异常处理方法
  • 非常感谢!

标签: flutter api dart


【解决方案1】:

你得到 Null 是因为你试图访问尚未初始化的 Hava 类。

您正在打印print(Hava.fromJson(body)); 之前return Hava.fromJson(body);

首先,您要检查是否从 http 调用中得到什么响应。

为此,您可以像这样打印 http 响应:-

print(responce.body)

然后你就可以看到响应是什么了。

他们可以做到return Hava.fromJson(body);

正确的方式

检查响应的状态码,如果响应为 200,则将 json 响应转换为模型类或显示错误

参考代码

Future<Profileclass> fetchprofile() async {
  String tokenFetch = await getStringValuesSF();

  return await Dio()
      .get(urlprofiledio,
          options: Options(
            headers: {
              'Authorization': 'Bearer $tokenFetch',
            },
          ))
      .then((response) {
    if (response.statusCode == 200) {
      return Profileclass.fromJson(jsonDecode(response.toString()));
    } else {
      throw Exception('Failed to load profile');
    }
  });
}

谢谢

【讨论】:

  • 非常感谢。问题出在我的专辑类中。我错误地定义了变量类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
相关资源
最近更新 更多