【问题标题】:Provider works in child but not in SearchDelegate提供者适用于孩子,但不适用于 SearchDelegate
【发布时间】:2020-05-09 20:35:28
【问题描述】:

这是错误:

Error: Could not find the correct Provider<List<ListTile>> above this Widget

我有一个显示来自FutureProvider 的项目的应用程序。我使用了两次提供程序,最后一次使用ListaProductos() 在同一页面中生成ListView,另一次在AppBar 上生成相同的ListView SearchDelegate

这是主页

@override
  Widget build(BuildContext context) {
    if (user != null) {
      return FutureProvider<List<ListTile>>.value(
        value:
            ServicioBaseDatos(usuarioUID: user.uid).listaProductos,
        child: new Scaffold(
          appBar: AppBar(
            title: Text(
              "Stock",
            ),
            actions: <Widget>[
              IconButton(
                icon: Icon(Icons.search),
                onPressed: () {
                  var listaProductos = Provider.of<List<ListTile>>(context);
                  showSearch(
                    context: context,
                    delegate: SearchProducto(listaProductos),
                  );
                },
              ),
            ],
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () => Navigator.of(context).push(new MaterialPageRoute(
                builder: (BuildContext context) => new CrearProductoPage())),
            child: Icon(
              Icons.add,
            ),
          ),
          drawer: MenuComponent(user.email == null ? '' : user.email),
          body: Container(
              decoration: BoxDecoration(
                  gradient: LinearGradient(
                      colors: [Color(0xFFAE885E), Color(0xFF557A95)])),
              child: ListaProductos()),
        ),
      );
    } else {
      return Text('Esperando identificador de usuario de la base de datos');
    }
  }

这是ListaProductos() 小部件(工作正常):

class ListaProductos extends StatefulWidget {
  @override
  _ListaProductosState createState() => _ListaProductosState();
}

class _ListaProductosState extends State<ListaProductos> {
  @override
  Widget build(BuildContext context) {
    final productos = Provider.of<List<ListTile>>(context);
    if (productos != null){
      return ListView.builder(
        itemCount: productos.length,
        itemBuilder: (context, index) {
          return  productos[index];
        },
      );
    }
    else {return Text('Esperando respuesta de base de datos');}
  }
}

这是SearchDelegate 实现(当我点击打开此页面的搜索图标时出现错误):

class SearchProducto extends SearchDelegate<ListTile> {

  final List<ListTile> listaProductos;

  SearchProducto(this.listaProductos);

  @override
  List<Widget> buildActions(BuildContext context) {
    return [
      IconButton(
        icon: Icon(Icons.clear),
        onPressed: () {
          query = '';
        },
      ),
    ];
  }

  @override
  Widget buildLeading(BuildContext context) {
    return IconButton(
      icon: Icon(Icons.arrow_back),
      onPressed: () {
        close(context, null);
      },
    );
  }

  @override
  Widget buildResults(BuildContext context) {
    return Container();
  }

  @override
  Widget buildSuggestions(BuildContext context) {
    if (listaProductos != null){
      return ListView.builder(
        itemCount: listaProductos.length,
        itemBuilder: (context, index) {
          return  listaProductos[index];
        },
      );
    }
    else {return Text('Esperando respuesta de BD');}
  }
}

我是 Boring show 的一半,但他们不使用 Provider。想法?感谢您的帮助!

编辑:这是FutureProvidervalue:

Future<List<ListTile>> get listaProductos async {
    List<ListTile> listaProd = [];
    final documentos = await colecUsuario
        .document(usuarioUID)
        .collection('ListaItems')
        .getDocuments();
    if (documentos != null) {
      for (var doc in documentos.documents) {
        for (var k in doc.data.keys) {
          listaProd.add(
            ListTile(
             title: Text(k),
             trailing: Text(doc.data[k].toString()),
            )
          );
        }
      }
    }
    return listaProd;
  }

【问题讨论】:

    标签: flutter search flutter-provider


    【解决方案1】:

    intentaste obtener la informationación dentro del Search en vez de pasarlo ?

    class SearchProducto extends SearchDelegate<ListTile> {
    
    
      @override
      List<Widget> buildActions(BuildContext context) {
        return [
          IconButton(
            icon: Icon(Icons.clear),
            onPressed: () {
              query = '';
            },
          ),
        ];
      }
    
      @override
      Widget buildLeading(BuildContext context) {
        return IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            close(context, null);
          },
        );
      }
    
      @override
      Widget buildResults(BuildContext context) {
        return Container();
      }
    
      @override
      Widget buildSuggestions(BuildContext context) {
        final listaProductos = Provider.of<List<ListTile>>(context);
        if (listaProductos != null){
          return ListView.builder(
            itemCount: listaProductos.length,
            itemBuilder: (context, index) {
              return  listaProductos[index];
            },
          );
        }
        else {return Text('Esperando respuesta de BD');}
      }
    }
    

    【讨论】:

    • 感谢响应者,si probé,y el error es el mismo
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2016-10-17
    相关资源
    最近更新 更多