【问题标题】:How to get commands to ListView.builder?如何获取 ListView.builder 的命令?
【发布时间】:2021-08-23 12:34:07
【问题描述】:

我对 Flutter 很陌生,我试图将命令添加到我的 ListView.builder

  Widget orderListView() {
    return ListView.builder(
        itemBuilder: (context, getOrders) => Card(
              child: ListTile(
                title: Text(getOrders.toString()),
                onTap: () => print('$getOrders'),
              ),
            ));
  }
}

基本上我需要在我的列表视图中显示订单列表

  Future<String> getOrders() async {
    return await
    http
        .post(
        Uri.parse('https://somerandomurl.com/admin/get_orders'),
        body: "{\"token\": \"admin_token\"}",
        headers: headers)
        .then((response) {
      print('Response status: ${response.statusCode}');
      print('Response body: ${response.body}');
      // return response.body;
    }).catchError((error) {
      print("Error: $error");
      // return error;
    });
  }

这是我的 getOrders 命令。当我打开我的列表视图屏幕时,是否可以获得我的订单列表并显示它?

【问题讨论】:

  • 当然可以,但中间少了 5 个步骤。你到底卡在哪里了?您的下一步是什么,您需要继续做什么?
  • 我不知道将我的“getOrders”命令放在哪里。尽管有订单,它仍不断向我显示列表中的数字。

标签: flutter dart listview


【解决方案1】:

我不确定您遇到了什么问题,但您的代码存在一些突出问题以及您希望它如何成为可能,但这是可能的,但您没有以正确的方式进行。首先,getOrders() 方法必须是 List&lt;String&gt; 类型,因为它是一个订单列表。

所以把它更新成这样:

Future<List<String>> getOrders() async {
    var orders = await http
    .post(
    Uri.parse('https://somerandomurl.com/admin/get_orders'),
    body: "{\"token\": \"admin_token\"}",
    headers: headers)
    .then((response) {
      print('Response status: ${response.statusCode}');
      print('Response body: ${response.body}');
      // return response.body;
    }).catchError((error) {
      print("Error: $error");
      // return error;
    });
    return orders;
}

既然您的方法返回的是一个列表而不是单个值,您可以按如下方式更新您的列表视图方法:

Widget orderListView(List<String> orders) {
    return ListView.builder(
        itemCount: orders.length, // You need this or it'll error
        itemBuilder: (context, index) {
            // Instead of saying orders[index] you can also do this:
            var item = orders[index]
            
            // You shouldn't use both a `Card` and a `ListTile`, Choose 
            // one
            return ListTile(
            title: Text(orders[index].toString()),
            onTap: () => print(orders[index]),
          ),
        }
    );
}

但这还不够。因为这是Future,所以您必须在某处调用它才能返回数据。有许多很棒的软件包可以帮助简化此过程,但如果没有,您可以这样做:

所以无论你的这个屏幕被称为什么,确保它是一个有状态的小部件。更新其余方法并合并 FutureBuilder:

import 'package:flutter/material.dart';

class MyOrdersWidget extends StatefulWidget {
  const MyOrdersWidget({ Key? key }) : super(key: key);

  @override
  _MyOrdersWidgetState createState() => _MyOrdersWidgetState();
}

class _MyOrdersWidgetState extends State<MyOrdersWidget> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _body(),
    );
  }

  Widget _body() {
    return FutureBuilder<List<String>>(
      future: getOrders(),
      initialData: const [],
      builder: (context, snapshot) {
        if(snapshot.data == null) return Text('Loading');
        if(snapshot.error == null) return Text('Error');
        if(snapshot.data!.length == 0) return Text('No Orders');
        return orderListView(snapshot.data);
      },
    );
  }
}

就像我之前说的,因为你是 Flutter 的新手,我强烈建议你使用一个包来帮助你进行这种开发。对于 http 请求,使用 Dio package,对于管理期货,FutureBuilder 可以,但我个人喜欢使用 flutter_riverpod,这里有一个 video

【讨论】:

  • 它说 Future> 不能分配给参数类型 List
  • 我的错,我忘了在getOrders()方法中添加await关键字,现在试试
  • 这个答案有帮助吗?如果是这样,请将其标记为正确的。
猜你喜欢
  • 1970-01-01
  • 2017-03-15
  • 2023-04-06
  • 2018-10-21
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
相关资源
最近更新 更多