如何将 ListView 构建器与提供程序一起使用?

Posted

技术标签:

【中文标题】如何将 ListView 构建器与提供程序一起使用?【英文标题】:How to use ListView builder with Providers? 【发布时间】:2020-10-24 22:50:29 【问题描述】:

我正在尝试使用 ListView Builder 和 Provider 创建水平滚动卡片。

Like this one

还有其他方法可以达到同样的效果吗?

它说

══╡ 小部件库发现异常╞═══════════════════════╕═══╕═␕═════════════════ ═════════════════════ 在构建 BookTile(dirty) 时引发了以下 ProviderNotFoundError: 错误:在此 BookTile 小部件上方找不到正确的提供程序

要修复,请:

确保 Provider 是此 BookTile 小部件的祖先 向 Provider 提供类型 向消费者提供类型 向 Provider.of() 提供类型 始终使用包导入。例如:`import 'package:my_app/my_code.dart'; 确保使用了正确的context

我的代码

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/files.dart';
import 'bookitem.dart';

class BookTile extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    final booksData = Provider.of<Files>(context);
    final books = booksData.items;

    return ListView.builder(
      scrollDirection: Axis.horizontal,
      itemCount: books.length,
      itemBuilder: (ctx, i) => ChangeNotifierProvider.value(
        value: books[i],
        child: BookItem(),
      ),
    );
  


class BookItem extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    final book = Provider.of<File>(context);
    return Container(
      width: 120,
      color: Colors.transparent,
      margin: EdgeInsets.only(right: 20),
      child: Card(
        child: Wrap(
          children: <Widget>[
            Image.network(book.cover),
            Container(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  Text(
                    '$book.completion %',
                    style: TextStyle(
                        color: Colors.black.withOpacity(0.5), fontSize: 12.4),
                  ),
                  IconButton(
                      icon: Icon(
                        Icons.more_horiz,
                        size: 14.5,
                      ),
                      onPressed: null)
                ],
              ),
            ),
          ],
        ),
      ),
    );
  

【问题讨论】:

在哪里声明您在此处提到的文件提供程序 final booksData = Provider.of(context); 【参考方案1】:

这不完全是你的代码,但你会明白的

// provider with ChangeNotifier      
List<Client>? _clients = [];

  get clients => _clients;

  addClient(Client client) async 
    _clients!.add(client);
    notifyListeners();
  

您想在哪里使用

Consumer<ClientProvider>(
          builder: (_, data, __) => Expanded(
            child: ListView.builder(
              itemCount: data.clients.length,
              itemBuilder: (context, index) 
                return ClientRow(data.clients[index]);
              ,)


here is the sample Im doing now

【讨论】:

以上是关于如何将 ListView 构建器与提供程序一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

您将如何将订阅管理器与流星的模板订阅一起使用?

将 JQuery 的日期选择器与引导程序一起使用

ChangeNotifierProxyProvider 构建器与更新问题

如何将 Shaka 打包器与 python 子进程调用一起使用?我收到此错误无效的流描述符名称/值对:

将 MaterialUI 伪类选择器与 makeStyles 一起使用

如何使用提供程序在 Flutter ui 中使用 api 响应获取 ListView 构建器数据