Flutter FutureBuilder 小部件动态列表长度

Posted

技术标签:

【中文标题】Flutter FutureBuilder 小部件动态列表长度【英文标题】:Flutter FutureBuilder widget dynamic list lenght 【发布时间】:2020-08-25 13:20:47 【问题描述】:

我正在尝试在 FutureBuilder 小部件中制作动态 ListView.builder,但无法获得来自 AsyncSnapshot 快照的列表长度。我试过itemCount: snapshot.data.lenght 但没有用。这是我的代码

class FlutterDemo extends StatelessWidget 
  final QuoteStorage storage;

  FlutterDemo(Key key, @required this.storage) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(title: const Text('Scrapy on flutter')),
      body: Center(
        child: FutureBuilder(
            future: storage.getQuotes(),
            builder: (context, AsyncSnapshot<Quotes> snapshot) 
              return snapshot.hasData ? ListView.builder(
                itemCount: snapshot.data.lenght,
                itemBuilder: (context, index) 
                  final quotes = snapshot.data;
                  return Card(
                      child: Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: Text(quotes.items[index].quote),
                      ));
                ,
              )
                  : const CircularProgressIndicator();
            ),
      ),
    );
  

数据来自 Quotes 类:

class Quotes extends Items 
  @override
  final List<Quote> items;
  Quotes(
    this.items,
  );

  factory Quotes.fromJson(String str) => Quotes.fromMap(json.decode(str));
  factory Quotes.fromMap(Map<String, dynamic> json) => Quotes(
        items: json["items"] == null
            ? null
            : List<Quote>.from(json["items"].map((x) => Quote.fromMap(x))),
      );

并引用用于构建未来的存储类:

class QuoteStorage 
  // ...
  // ...
  Future<Quotes> getQuotes() async 
    final file = await _localFile;
    final contents = await file.readAsString();
    return Quotes.fromJson(contents);
  

如果我不提供动态的 itemCount(从 url 获取),应用程序就会崩溃。 有什么想法吗?

【问题讨论】:

【参考方案1】:

您收到错误是因为您拼写了length 错误。

您可以通过更正 length 的拼写来解决此问题。 用下面的代码替换你的 FlutterDemo

效果很好。

class FlutterDemo extends StatelessWidget 
  final QuoteStorage storage;

  FlutterDemo(Key key, @required this.storage) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(title: const Text('Scrapy on flutter')),
      body: Center(
        child: FutureBuilder(
            future: storage.getQuotes(),
            builder: (context, AsyncSnapshot<Quotes> snapshot) 
              return snapshot.hasData ? ListView.builder(
                // current the spelling of length here
                itemCount: snapshot.data.length,
                itemBuilder: (context, index) 
                  final quotes = snapshot.data;
                  return Card(
                      child: Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: Text(quotes.items[index].quote),
                      ));
                ,
              )
                  : const CircularProgressIndicator();
            ),
      ),
    );
  

我希望这会有所帮助。

【讨论】:

感谢您在此处指出,我发现需要使用itemCount: snapshot.data.items.length 因为items 是我可以从中获得计数的列表。

以上是关于Flutter FutureBuilder 小部件动态列表长度的主要内容,如果未能解决你的问题,请参考以下文章

使用 Futurebuilder 有条件地渲染小部件

Flutter:不清楚 ValueChanged 和 FutureBuilder

FutureBuilder 错误:返回类型“对象?”不是闭包上下文所要求的“小部件”

Flutter + SharedPreferences:如何使用 FutureBuilder

Flutter 中 ChangeNotifier 的构建器小部件

Flutter:有状态的小部件不更新