Api 无法在Flatter中访问initState中获取的数据
我有一个名为Cards的类,它有一个方法getCards,返回一个未来。我使用此方法从端点获取卡片 卡片: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&
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);
});