【问题标题】:Dart, Flutter, Future Builder, ListViewBuilderDart、Flutter、Future Builder、ListViewBuilder
【发布时间】:2021-03-04 23:38:30
【问题描述】:

我有来自 api 的响应,它有 83 个对象,但我的应用程序不会呈现超过 39 个项目,错误 RangeError (index): Invalid value: Valid value range is empty: 0,如果我将 itemCount 替换为 39 工作正常,我哪里出错了?也许是因为我在 initState 中使用了 setState?我无法显示更多代码,因为论坛阻止了它我的代码在这里:

  void initState() {
    super.initState();
    Future.delayed(Duration(seconds: 1), () {
      loadFuture = NetworkUtils.getOrdersByUserId(id);
      NetworkUtils.getOrdersByUserId(id).then((value) {
        setState(() {
          orders = value;
        });
      });
    });
  }
class _OrderPageState extends State<OrderPage> {
  var orders = [];
  Future loadFuture;
  Timer timer;
  


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          SizedBox(
            height: 8,
          ),
          Expanded(
            child: FutureBuilder<dynamic>(
              future: loadFuture,
              builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
                if (snapshot.hasData &&
                    snapshot.connectionState != ConnectionState.waiting) {
                  return ListView.builder(
                    itemCount: orders.length,
                    itemBuilder: (BuildContext context, int index) {
                      return Container(
                        margin:
                            EdgeInsets.symmetric(horizontal: 8, vertical: 6),
                        decoration: BoxDecoration(
                          borderRadius: BorderRadius.circular(5),
                          boxShadow: [
                            BoxShadow(
                              offset: Offset(0, 1),
                              blurRadius: 3,
                              color: Color(0xFF12153D).withOpacity(0.2),
                            ),
                          ],
                        ),
                        
                          child: Text('Here more info ')
                          
                        ),
                      );
                    },
                  );
                } else {
                  //
                }
              },
            ),
          ),
        ],
      ),
    );
  }
}

if itemsCount = orders.length

if itemsCount = 39

【问题讨论】:

  • 在您的initState 上,您应该等待您的Future
  • 不行,initState不能await,必须是同步功能

标签: flutter listview setstate flutter-futurebuilder


【解决方案1】:

您执行了两次查询。

  1. loadFuture = NetworkUtils.getOrdersByUserId(id);
  2. NetworkUtils.getOrdersByUserId(id).then((value) {});

改成这样:

@override
  void initState() {
    super.initState();
    Future.delayed(Duration(seconds: 1), () {
      loadFuture = NetworkUtils.getOrdersByUserId(id);
      loadFuture.then((value) {
        setState(() {
          orders = value;
        });
      });
    });

【讨论】:

  • 我明白了,但我的问题仍然存在(((
  • NetworkUtils.getOrdersByUserId(id)一定有问题
  • static dynamic getOrdersByUserId(id) async { var uri = host + orders + id; try { final response = await Dio().get(uri).timeout(Duration(seconds: 10), onTimeout: () { return null; }); return response.data; } catch (e) { print(e); } } 这是我获取数据的功能,在另一个页面中同样的功能可以正常工作
  • 它是正确的,我有响应数据,一切正常,但是我的构建器无法呈现它
猜你喜欢
  • 1970-01-01
  • 2021-03-02
  • 2020-01-05
  • 2020-10-04
  • 2023-01-03
  • 2020-06-19
  • 2021-07-07
  • 1970-01-01
  • 2021-11-20
相关资源
最近更新 更多