Api 无法在Flatter中访问initState中获取的数据

Api 无法在Flatter中访问initState中获取的数据,api,flutter,flutter-provider,flutter-state,Api,Flutter,Flutter Provider,Flutter State,我有一个名为Cards的类,它有一个方法getCards,返回一个未来。我使用此方法从端点获取卡片 卡片: import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; class Cards { String _accessToken; String _refreshToken; List&

我有一个名为Cards的类,它有一个方法getCards,返回一个未来。我使用此方法从端点获取卡片

卡片

import 'dart:convert';

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

class Cards {
  String _accessToken;
  String _refreshToken;

  List<dynamic> cardsId = List();

  Future<dynamic> getCards() async {
    SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
    _accessToken = sharedPreferences.getString("access");
    _refreshToken = sharedPreferences.getString("refresh");
    var jsonData;

    var response = await sendRequestToGetCards(
        url: "http://10.0.2.2:8000/accounts/list/", accessToken: _accessToken);
    if (response.statusCode == 200) {
      jsonData = json.decode(utf8.decode(response.bodyBytes));
      return jsonData;
    } else if (response.statusCode == 401) {
      _accessToken = await getNewAccessToken(_refreshToken);
      response = await sendRequestToGetCards(
          url: "http://10.0.2.2:8000/accounts/list/",
          accessToken: _accessToken);
      if (response.statusCode == 200) {
        jsonData = json.decode(utf8.decode(response.bodyBytes));
        return jsonData;
      }
    }
  }

  getNewAccessToken(String refreshToken) async {
    var refreshResponse = await http.post(
        "http://10.0.2.2:8000/users/api/token/refresh/",
        body: {'refresh': refreshToken});
    if (refreshResponse.statusCode == 200) {
      var jsonData = json.decode(refreshResponse.body);
      return jsonData['access'];
    }
  }

  sendRequestToGetCards({String url, String accessToken}) async {
    var response = await http.get(
      url,
      headers: {"Authorization": "Bearer $accessToken"},
    );
    return response;
  }
}

导入'dart:convert';
将“package:http/http.dart”导入为http;
导入“package:shared_preferences/shared_preferences.dart”;
班级卡{
字符串_accessToken;
字符串\u刷新令牌;
List cardsId=List();
Future getCards()异步{
SharedReferences SharedReferences=等待SharedReferences.getInstance();
_accessToken=SharedReferences.getString(“访问”);
_refreshToken=SharedReferences.getString(“刷新”);
var jsonData;
var响应=等待sendRequestToGetCards(
url:“http://10.0.2.2:8000/accounts/list/,accessToken:_accessToken);
如果(response.statusCode==200){
jsonData=json.decode(utf8.decode(response.bodyBytes));
返回jsonData;
}else if(response.statusCode==401){
_accessToken=等待getNewAccessToken(\u refreshToken);
响应=等待sendRequestToGetCards(
url:“http://10.0.2.2:8000/accounts/list/",
accessToken:_accessToken);
如果(response.statusCode==200){
jsonData=json.decode(utf8.decode(response.bodyBytes));
返回jsonData;
}
}
}
getNewAccessToken(字符串刷新令牌)异步{
var refreshResponse=wait http.post(
"http://10.0.2.2:8000/users/api/token/refresh/",
正文:{'refresh':refreshToken});
如果(refreshResponse.statusCode==200){
var jsonData=json.decode(refreshResponse.body);
返回jsonData['access'];
}
}
sendRequestToGetCards({String url,String accessToken})异步{
var response=wait http.get(
网址,
标题:{“授权”:“持有者$accessToken”},
);
返回响应;
}
}
我还有一个名为CardData的类作为我的提供者数据/状态:

import 'package:flutter/material.dart';

import '../cards/cards.dart';

class CardData extends ChangeNotifier {
  static Cards cards = Cards();

  Future<dynamic> cardsList = cards.getCards;

}
导入“包装:颤振/材料.省道”;
导入“../cards/cards.dart”;
类CardData扩展ChangeNotifier{
静态卡片=卡片();
未来卡片列表=cards.getCards;
}
您可以看到,我从Cards创建了一个对象来访问getCards,这使我能够访问返回的未来并将其保存在cardsList

现在,在我用来显示所有卡片的小部件中,我创建了一个名为addToList的方法来访问提供者数据

我创建了一些列表来保存小部件,以便稍后将它们传递给其他小部件

List<Widget> cardsList = List();
List<dynamic> cardsId = List();

List<Widget> nonCards = List();
List<dynamic> nonCardsId = List();

addToList() async {
    var jsonData = await Provider.of<CardData>(context).cardsList;
    for (var i = 0, len = jsonData.length; i < len; i++) {
      if(jsonData[i]['account_type'] == "1") {
        cardsList.add(
          BankCard(
            bankName: jsonData[i]['title'],
            colors: [Color(0xFFD00E00), Color(0xFFF44336)],
            cardNumber: jsonData[i]['number'],
            cardDesc: jsonData[i]['description'],
          ),
        );
        cardsId.add(jsonData[i]['id']);
      } else if(jsonData[i]['account_type'] == "2") {
        nonCards.add(
          NonBankCard(
            bankName: jsonData[i]['title'],
            colors: [Color(0xFFFF4B2B), Color(0xFFFDB76C)],
          ),
        );
        nonCardsId.add(jsonData[i]['id']);
      }
    }
  }

List cardsList=List();
List cardsId=List();
List nonCards=List();
List nonCardsId=List();
addToList()异步{
var jsonData=wait Provider.of(context).cardsList;
for(var i=0,len=jsonData.length;i

但是我需要在initState中使用addToList方法,您知道,但我不能。当我在那里使用它时,应用程序屏幕将消失。

您应该在开始时初始化列表

  List<Widget> cardsList = new List<Widget>();
addToList()
的末尾,将更新的列表放入
setState()


我已经在那里登记了。我在州里打过电话,但没用。
@override
  void initState() {
     addToList();
}
setState(() {
    cardsList = List.from(cardsList);
});