【问题标题】:Fetching data simultaneously in flutter在颤动中同时获取数据
【发布时间】:2019-11-21 03:14:19
【问题描述】:

我需要对此进行澄清,我创建了一个包含 asyn 的 sharepreferrence 函数,并且在同一个函数中我试图从服务器获取数据,并且我正在使用 FutureBuilder 来显示输出 但我观察到的是数据一直在同时获取,
可能是什么问题。这是代码

我的数据获取函数

List<TransactionsModel> parseTransactons (String responseBody) {
  Map data = json.decode(responseBody);
  var output = data['transactions']; //returns a List of Maps
  final castingtoMAP =  output.cast<Map<String, dynamic>>();
  return castingtoMAP.map<TransactionsModel>((json) => 
    TransactionsModel.fromJson(json)).toList();
}

Future<List<TransactionsModel>> fetchTransactions(http.Client client)  async {
  final SharedPreferences prefs = await 
  SharedPreferences.getInstance();
  String email = prefs.getString('Email');
  String session = prefs.getString('session');

  var map = new Map<String, String>();
  map["email"] = email;
  map["sesscode"] = session;

  var response = await http.post(new API().Transaction, body: map);
  print('*********Response from Transaction API***** $response');
  return parseTransactons(response.body); 
} 

显示数据

FutureBuilder<List<TransactionsModel>>(
  future: fetchTransactions(http.Client()),
  builder: (context, snapshot) {
    if (snapshot.hasError)
       return MyFunctions().showToast(snapshot.error);
    return snapshot.hasData
      ? TransactionCardWidget(snapshot.data)
      : Center(child: CircularProgressIndicator());
  },
),

【问题讨论】:

  • 您能否解释一下“数据不断同时获取”的含义?
  • @Martyns 数据不断获取和获取,即我使用它来检查 print('*********Response from Transaction API***** $response');但是这条线不断重复,它使应用程序冻结。
  • 你使用的是StatefulWidget还是StatelessWidget?
  • @EsenMehmet。我正在使用 StateFulWidget。
  • @Harbdollar 这就是问题所在。使用变量 assign 或使用 StatelessWidget 在 initState 中执行 future。

标签: api flutter dart


【解决方案1】:

如果您的小部件是StatelessStateful,并且您正在调用setState,则正在通过调用fetchTransactions 创建Future&lt;List&lt;TransactionsModel&gt;&gt; 的新实例,从而发出新请求。您需要将函数返回的Future保存在StatefulWidgetState中,然后在initState函数中调用fetchTransactions

class .... extends State<..> {
    Future<List<TransactionsModel>> transactionsFuture;

    void initState() {
        transactionsFuture = fetchTransactions(http.Client());
    }

    Widget build(BuildContext context){
        ...
        FutureBuilder<List<TransactionsModel>>(
            future: transactionsFuture,
            builder: (context, snapshot) {
        ...
    }
}

【讨论】:

  • 是不是说,我在获取数据的时候一定不能使用setState()?
  • @Harbdollar 在我的示例中,您在 initState 中仅获取一次数据。之后,FutureBuilder 将处理其余部分,因此您无需为 transactionModel 调用 setState。您仍然可以为您的 State 中可能拥有的其他变量调用 setState,因为 Future 不会被重新创建。
  • 好的。但是我只是在我的 ListView 中包含 Futurebuilder,虽然我没有粘贴整个代码..
  • 在这种情况下,您的交易模型似乎只能获取一次,因此您可以将 ListView 设为 FutureBuilder 的子项
猜你喜欢
  • 1970-01-01
  • 2020-05-12
  • 2021-10-29
  • 2023-02-06
  • 2021-09-24
  • 2022-01-22
  • 2021-09-30
  • 2020-08-14
  • 1970-01-01
相关资源
最近更新 更多