'getUserData' 方法在 null 上被调用。接收者:null 尝试调用:getUserData()

时间:2021-05-23 22:59:52

标签: flutter dart flutter-futurebuilder

我正在尝试从我的服务器获取用户的货币。到目前为止,我能够做到这一点,但问题是每次重建应用程序时,数据都会自行重建。我试图通过这种方式解决这个问题:

  Future<dynamic> userDataFuture;

ApiService apiService;

 @override
 void initState() {
userDataFuture = apiService.getUserData();
super.initState();
}

但是失败了,因为它给了我一个错误提示:

<块引用>

'getUserData' 方法在 null 上被调用。接收者:null 尝试调用:getUserData()

这是我的ApiService类

  Future getUserData() async {
String token = await AuthProvider().getToken();
String userID = await AuthProvider().getUserId();

final response = await Dio().get(
  '$apiUrl/$userID',
  options: Options(headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer $token',
  }),
);

if (response.statusCode == 200) {
  return response.data;
} else {
  throw Exception('Failed to load data');
}
}
<块引用>

这是我的用户界面,我想在其中显示用户的货币:

      child: Center(
                      child: FutureBuilder(
                        future: userDataFuture,
                        builder:
                            (BuildContext context, AsyncSnapshot snapshot) {
                          if (snapshot.hasError) {
                            return Center(
                              child: Text(
                                  "Something wrong with message: ${snapshot.error.toString()}"),
                            );
                          } else if (snapshot.connectionState ==
                              ConnectionState.done) {
                            return Text(
                                snapshot.data[
                                    'currency'], // This Should Change Depending in Settings of the User
                                style: TextStyle(
                                    fontSize:
                                        (device.localWidth * .1) * .43,
                                    fontWeight: FontWeight.w500,
                                    color: kLightTextColor));
                          } else {
                            return Center(
                              child: CircularProgressIndicator(),
                            );
                          }
                        },

                        // ),
                      ),
                    ),

2 个答案:

答案 0 :(得分:1)

您在未初始化的 getUserData() 对象上调用 ApiService - 即。空。

代替这个

ApiService apiService;

其实就是这样初始化

final apiService = ApiService();

这将消除您的空错误。您也可以将 apiService.getUserData() 传递到您的 FutureBuilder 中,然后完全摆脱 userDataFuture 对象。

答案 1 :(得分:0)

首先你必须使用await,这里像这样

userDataFuture = await apiService.getUserData();

第二,你必须像这样初始化你的 apiService 变量:

ApiService apiService = new ApiService();

第三,改变你的 getUserData 返回一些数据,它是 void 函数。

第四个你必须使用这样的想法:

setState(() {
    userDateFuture = await apiService.getUserData();
});

希望能帮上忙。