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

时间:2020-03-31 09:44:46

标签: api flutter flutter-provider flutter-state

我有一个名为Cards的类,该类具有方法 getCards ,该方法返回一个 Future 。我使用这种方法从端点获取卡。

卡片

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;
  }
}

我还有一个名为 CardData 的类,作为我的提供者数据/状态:

import 'package:flutter/material.dart';

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

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

  Future<dynamic> cardsList = cards.getCards;

}

您会看到我从Cards创建了一个对象来访问 getCards ,这使我能够访问返回的Future并将其保存在 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']);
      }
    }
  }

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

1 个答案:

答案 0 :(得分:0)

您应该从头开始初始化列表

  List<Widget> cardsList = new List<Widget>();

在initState函数中调用addToList:

@override
  void initState() {
     addToList();
}

addToList()的末尾,将更新后的列表放在setState()

setState(() {
    cardsList = List.from(cardsList);
});