这是错误:
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;
}
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');}
}
}