没有为类型“Future<List<Item>>”定义吸气剂“长度”

Posted

技术标签:

【中文标题】没有为类型“Future<List<Item>>”定义吸气剂“长度”【英文标题】:The getter 'length' isn't defined for the type 'Future<List<Item>>' 【发布时间】:2021-11-18 10:18:00 【问题描述】:

我正在 Flutter 中编写一种待办事项列表,并启用了 null 安全性。 我正在使用 sqflite 将待办事项列表存储在 sqlite 数据库中。

Item 类如下:

class Item 
  int? _id;
  String? _name;
  String? _notes;
  String? _expiryDate;
  int? _category;
  int? _quantity;
  
  Item(
    this._id,
    this._name,
    this._notes,
    this._expiryDate,
    this._category,
    this._quantity,
  );

  // names for db table and columns
  String tableItems = 'items';
  String colId = 'id';
  String colName = 'name';
  String colNotes = 'notes';
  String colExpiryDate = 'expiryDate';
  String colCategory = 'category';
  String colQuantity = 'quantity';
  
  // Getters
  int? get id => _id;
  String? get name => _name;
  String? get notes => _notes;
  String? get expiryDate => _expiryDate;
  int? get category => _category;
  int? get quantity => _quantity;

  // Imports the Item details from a map
  Item.fromMap(Map map) 
    this._id = map[colId];
    this._name = map[colName];
    this._notes = map[colNotes];
    this._expiryDate = map[colExpiryDate];
    this._category = map[colCategory];
    this._quantity = map[colQuantity];
  

  // Converts a Item into a Map
  Map<String, dynamic> toMap() 
    var map = Map<String, dynamic>();
    map['id'] = _id;
    map['name'] = _name;
    map['notes'] = _notes;
    map['expiryDate'] = _expiryDate;
    map['category'] = _category;
    map['quantity'] = _quantity;
    return map;
  

  // Implement toString to make it easier to see information about
  // each dog when using the print statement.
  @override
  String toString() 
    return 'Itemid: $_id, name: $_name, notes: $_notes, expiryDate: $_expiryDate, category: $_category, quantity: $_quantity';
  
  

我有一个名为 items_controller 的类,它充当 Item 类和 db_controller 类之间的中介。 这是 items_controller 类:

import 'package:get/get.dart';
import 'package:<redacted>/model/item.dart';

import 'db_controller.dart';

class ItemsController extends GetxController 
  // names for db table and columns
  String tableItems = 'items';
  String colId = 'id';
  String colName = 'name';
  String colNotes = 'notes';
  String colExpiryDate = 'expiryDate';
  String colCategory = 'category';
  String colQuantity = 'quantity';

  //TODO
  void loadItem() 

  // function to retrieve all the items from the db
  Future<List<Item>> loadAllItems() async 
    final dbController = DBController();
    final List<Map<String, dynamic>> itemsMaps =
        await dbController.query(tableItems);

    return List.generate(itemsMaps.length, (i) 
      return Item.fromMap(itemsMaps[i]);
    );
  

  // function to add an item to the db
  Future<int> addItem(Item item) async 
    final dbController = DBController();
    // add a new Item to the table and get the id
    int id = await dbController.insertElement(tableItems, item);
    return id;
  

  //TODO
  void updateItem() 

  //TODO
  void deleteItem(int index) 

鉴于此,从 list_builder(它使用 ListView.builder 方法)我想使用从数据库中查询的项目列表的长度作为索引来构建一个列表。 但我有这个错误(如标题) [![截图][1]][1] [1]:https://i.stack.imgur.com/Z6VAh.png

我很确定调用 loadAllItems() 时得到的 Future 应该有一个 length 属性,因为它是一个列表,但我不确定,可能是因为这是一个未来清单? 请帮忙!

编辑 我已经实现了 FutureBuilder,但我对 .length 属性没有运气: [![快照][2]][2] [2]:https://i.stack.imgur.com/QswA0.png

如果我仍然运行代码,我会收到以下错误:

Performing hot restart...
Syncing files to device AC2003...
lib/views/list_builder.dart:21:45: Error: The getter 'length' isn't defined for the class 'Object'.
 - 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'length'.
                  itemCount: snapshot.data!.length,
                                            ^^^^^^
lib/views/list_builder.dart:16:20: Error: A non-null value must be returned since the return type 'Widget' doesn't allow null.
 - 'Widget' is from 'package:flutter/src/widgets/framework.dart' ('../../flutter/packages/flutter/lib/src/widgets/framework.dart').
          builder: (context, snapshot) 
                   ^
Restarted application in 671ms.

【问题讨论】:

这能回答你的问题吗? What is a Future and how do I use it? 【参考方案1】:

由于 loadAllItems() 调用是 Future,您需要将 ListBuilder 包装在 FutureBuilder 中。观看此视频了解更多信息。

基本上,你需要等待Future的结果,让它变成一个List。

【讨论】:

我添加了 FutureBuilder,但我遇到了同样的错误。我已经更新了帖子。 确保你的 FutureBuilder 声明了它所期望的类型....FutureBuilder>()【参考方案2】:

FutureBuilder 是您加载异步数据所需的,并在ConnectionState 完成后获取列表

FutureBuilder(
          future: controller.loadAllItems(),
          builder: (BuildContext context, AsyncSnapshot<String> snapshot) 
            if (snapshot.connectionState == ConnectionState.done) 
              int count =  snapshot.data.length; // use this as itemCount in Listview
              return ListView.Builder(); // write builder code here
            
          ),

供阅读https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

【讨论】:

我添加了 FutureBuilder,但我遇到了同样的错误。我已经更新了帖子。【参考方案3】:

你猜对了,因为是未来,所以必须在函数前加上await

您可以使用FutureBuilder 并将函数传递给future 参数,然后通过快照访问列表,如下所示:

GetX<ItemController>(
              builder: (controller) => FutureBuilder<List<Item>>(
                future: controller.loadAllItems(),
                builder: (context, snapshot) => snapshot.connectionState == ConnectionState.waiting
                    ? CircularProgressIndicator()
                    : snapshot.hasData
                        ? ListView.builder(
                            itemCount: snapshot.data.length,
                            itemBuilder: (context, index) => Container(
                                //data widget
                                ),
                          )
                        : Container(
                            // empty widget
                            ),
              ),
            ),

或者您可以在页面加载时调用该函数,并将项目保存在变量中(可能在控制器中,或小部件本身),然后使用该变量获取length

重要提示

确保未来的构建器在每种情况下都返回一个小部件,在您更新的问题中,有一个错误表明构建器返回一个空值

【讨论】:

我已经添加了 FutureBuilder,但我遇到了同样的错误。我已经更新了帖子。 我已经更新了代码,请检查一下,只需将 FutureBuilder 设为 类型 现在可以使用了。我想知道为什么 Flutter(或 Dart)有时会变硬!!! 很高兴听到这个消息,多练习会更容易

以上是关于没有为类型“Future<List<Item>>”定义吸气剂“长度”的主要内容,如果未能解决你的问题,请参考以下文章

没有找到能够从类型转换为类型的转换器

没有为“GoogleMapController”类型定义方法“addMarker”

PhpStorm - 有没有办法将 PHPDoc 转换为类型提示并返回类型声明?

没有为类型 'Widget' 定义 getter 'preferredSize'

为没有或许多不同参数类型的函数定义 Typescript 类型

没有为类型“type”定义方法“fromjson”