我正在尝试从BloC更新我的列表视图小部件,但是它总是返回一个空的snapshot.BLoC正在使用一个使用sqflite的异步SQLite查询流。直接访问时,sqflite查询似乎正在工作。
以下是UI部分的一个片段:
ListBloc listBloc = ListBloc();
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Column(
children: [
Expanded(child: getBoxList()),
FlatButton(
onPressed: () {
listBloc.queryBoxes();
},
child: Text('pull data'),
),
],
),
),
);
}
Widget getBoxList() {
return StreamBuilder(
stream: listBloc.boxes,
builder: (BuildContext context, AsyncSnapshot<List<Box>> snapshot) {
return getList(snapshot);
});
}
Widget getList(AsyncSnapshot<List<Box>> snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
return Text(snapshot.data[index].boxName);
},
);
} else {
return Text('snapshot has no data');
}
}她的是BloC的一个片段:
class ListBloc {
final _boxListController = StreamController<List<Box>>.broadcast();
final DatabaseHelper _db = DatabaseHelper.instance;
get boxes => _boxListController.stream;
ListBloc() {
getAllIBoxes();
}
getAllIBoxes() async {
_boxListController.sink
.add(await _db.queryAllBoxRows(DatabaseHelper.tableBoxes));
}
dispose() {
// _itemListController.close();
_boxListController.close();
}
}在BLoC外部测试时,_db.queryAllBoxRows(DatabaseHelper.tableBoxes)工作得很好。
谢谢!
-更新--
下面是BLoC中的queryBoxes函数。我只是添加了这个来测试查询是否返回数据。
queryBoxes() async {
DatabaseHelper _db = DatabaseHelper.instance;
final _boxes = await _db.queryAllBoxRows(DatabaseHelper.tableBoxes);
_boxes.forEach((element) {
print(element.boxName);
});
}-更新2 --
流的来源:
getAllIBoxes() async {
_boxListController.sink
.add(await _db.queryAllBoxRows(DatabaseHelper.tableBoxes));
}是_db.queryAllBoxRows(DatabaseHelper.tableBoxes),这是我的DatabaseHelper中的一个方法,如下所示。
Future<List<Box>> queryAllBoxRows(table) async {
Database db = await instance.database;
final _result = await db.query(table);
List<Box> box = _result.map((e) => Box.fromDatabaseJson(e)).toList();
return box;
}发布于 2021-02-05 19:39:11
您只需打印queryBoxes函数中的值。您必须通知您的流有可用的数据,为此,您必须将值添加到接收器。
将您的函数修改为:
queryBoxes() async {
DatabaseHelper _db = DatabaseHelper.instance;
final _boxes = await _db.queryAllBoxRows(DatabaseHelper.tableBoxes);
_boxes.forEach((element) {
print(element.boxName);
});
_boxListController.sink.add(boxes);
}https://stackoverflow.com/questions/66061127
复制相似问题