Provider在子对象中起作用,但在SearchDelegate中不起作用

问题描述 投票:0回答:1

这是错误:

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

我有一个显示FutureProvider中项目的应用程序。我使用提供程序两次,最后一次使用ListView在同一页中生成一个ListaProductos(),另一次在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中途,但他们不使用提供者。有想法吗?感谢您的帮助!

编辑:这是value:FutureProvider

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个回答
0
投票

intentaste obtener lainformationacióndentro 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');}
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.