【问题标题】:RangeError (index): Invalid value: Valid value range is empty: 0 in flutter FirestoreRangeError(索引):无效值:有效值范围为空:flutter Firestore中的0
【发布时间】:2021-02-23 12:20:56
【问题描述】:

将我的项目连接到 Firestore 并创建集合、文档等后,当我尝试在索引 0 处打印产品名称时,这是我遇到的错误。

在构建 FutureBuilder(dirty, state: _FutureBuilderState#18c55) 时引发了以下 RangeError: RangeError(索引):无效值:有效值范围为空:0

I have read this similar question posted here but it does not solve my issue

以下是我的代码除外

class Home extends StatelessWidget {

Product menData;

@override
Widget build(BuildContext context) {
  return WillPopScope(
    onWillPop: _onBackPressed,
      child: Scaffold(
        body: SafeArea(
          child: Padding(
            padding: EdgeInsets.only(top: 10, left: 10, right: 10),
              child: FutureBuilder(
             future: FirebaseFirestore.instance.collection("products")
                      .doc("6di1OSBgwOjyLbPtl75g").collection("recent").get(),
            builder: (context, snapshot) {
              if(snapshot.connectionState == ConnectionState.waiting){
                return Center(
                  child: spinkit,
                );
              }
              menData = Product(
                image: snapshot.data.documents[0]["image"],
                name: snapshot.data.documents[0]["name"],
                price: snapshot.data.documents[0]["price"],
              );
              print(menData.name);

这是模型

导入'package:flutter/material.dart';

class Product {
  final String image;
  final String name;
  final double price;

  Product({@required this.image, @required this.name, @required this.price});

}

【问题讨论】:

标签: flutter dart google-cloud-firestore


【解决方案1】:

FutureBuilder 倾向于隐藏数据类型错误。这很可能是您通话中的问题FirebaseFirestore.instance.collection("products").doc("6di1OSBgwOjyLbPtl75g").collection("recent").get(),

我猜有些产品没有加载正确的类型,

      final String image;
      final String name;
      final double price;  

可能double priceint 或类似的奇怪形式出现。我已经诊断出其中一些问题,它们几乎总是像你的错误一样出现:

使用此示例的“快照视图检查”替换您的视图。它将验证您的错误并显示正确的错误:https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

List<Widget> children;
          if (snapshot.hasData) {
            children = <Widget>[
              Icon(
                Icons.check_circle_outline,
                color: Colors.green,
                size: 60,
              ),
              Padding(
                padding: const EdgeInsets.only(top: 16),
                child: Text('Result: ${snapshot.data}'),
              )
            ];
          } else if (snapshot.hasError) {
            children = <Widget>[
              Icon(
                Icons.error_outline,
                color: Colors.red,
                size: 60,
              ),
              Padding(
                padding: const EdgeInsets.only(top: 16),
                child: Text('Error: ${snapshot.error}'),
              )
            ];
          } else {
            children = <Widget>[
              SizedBox(
                child: CircularProgressIndicator(),
                width: 60,
                height: 60,
              ),
              const Padding(
                padding: EdgeInsets.only(top: 16),
                child: Text('Awaiting result...'),
              )
            ];
          }
          return Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: children,
            ),
          );

【讨论】:

    【解决方案2】:

    此错误"Invalid value: Valid value range is empty: 0" 发生是因为您的列表索引值为空,但您必须强制调用该值。

    尝试将这 3 行临时更改为硬编码值:

    image: snapshot.data.documents[0]["image"]
    name: snapshot.data.documents[0]["name"]
    price: snapshot.data.documents[0]["price"]
    
    to 
    
    image: 'hardcode'
    name: 'harcode'
    price: 'hardcode'
    

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 2021-11-13
      • 1970-01-01
      • 2021-06-16
      • 2021-07-31
      • 1970-01-01
      • 2019-07-25
      • 2021-01-01
      • 2020-11-01
      相关资源
      最近更新 更多