我在我的购物 list 应用程序中使用Riverpod
进行状态管理.对于产品屏幕,我想添加一个实时搜索栏,以便用户可以过滤某些产品.
我使用SQFlite
作为数据库,并使用Repository
模式来访问它.
以下是我到目前为止设法编写的代码,但它在搜索栏中没有返回任何内容.
final productProvider = FutureProvider<Map<String, dynamic>?>((ref) async {
final searchText = ref.watch(searchTextProvider);
final repository = Repository<Product>("Product");
if (searchText.isNotEmpty) {
final result = await repository.getByName(searchText);
return result;
}
return null;
});
final searchTextProvider = StateProvider<String>((ref) => '');
class ProductScreen extends ConsumerWidget {
const ProductScreen({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final productsAsyncValue = ref.watch(productProvider);
return Scaffold(
appBar: AppBar(
title: const Text('Tela de Produtos'),
),
body: Column(
children: [
TextField(
onChanged: (value) {
ref.read(searchTextProvider);
},
decoration: const InputDecoration(
labelText: 'Pesquisar',
),
),
Expanded(
child: productsAsyncValue.when(
data: (data) {
if (data != null) {
return ListView.builder(
itemCount: data.length,
itemBuilder: (context, index) {
final product = data[index];
return ListTile(
title: Text(product['name']),
);
},
);
} else {
return Text('Nenhum resultado encontrado');
}
},
loading: () => CircularProgressIndicator(),
error: (error, stackTrace) => Text('Erro: $error'),
),
),
],
),
);
}
}
以下是My Repository中getByName
的代码,如果这是问题所在:
Future<Map<String, dynamic>?> getByName(String name) async {
final map = await dbProvider.db.query(
tableName,
where: 'name = ?',
whereArgs: [name],
);
if (map.isNotEmpty) {
return map.first;
}
return null;
}