首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BLoC正在返回空快照。BLoC流来自Sqflite

BLoC正在返回空快照。BLoC流来自Sqflite
EN

Stack Overflow用户
提问于 2021-02-05 17:56:50
回答 1查看 44关注 0票数 0

我正在尝试从BloC更新我的列表视图小部件,但是它总是返回一个空的snapshot.BLoC正在使用一个使用sqflite的异步SQLite查询流。直接访问时,sqflite查询似乎正在工作。

以下是UI部分的一个片段:

代码语言:javascript
复制
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的一个片段:

代码语言:javascript
复制
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函数。我只是添加了这个来测试查询是否返回数据。

代码语言:javascript
复制
queryBoxes() async {
    DatabaseHelper _db = DatabaseHelper.instance;
    final _boxes = await _db.queryAllBoxRows(DatabaseHelper.tableBoxes);
    _boxes.forEach((element) {
      print(element.boxName);
    });
  }

-更新2 --

流的来源:

代码语言:javascript
复制
getAllIBoxes() async {
    _boxListController.sink
        .add(await _db.queryAllBoxRows(DatabaseHelper.tableBoxes));
  }

_db.queryAllBoxRows(DatabaseHelper.tableBoxes),这是我的DatabaseHelper中的一个方法,如下所示。

代码语言:javascript
复制
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;
  }
EN

回答 1

Stack Overflow用户

发布于 2021-02-05 19:39:11

您只需打印queryBoxes函数中的值。您必须通知您的流有可用的数据,为此,您必须将值添加到接收器。

将您的函数修改为:

代码语言:javascript
复制
queryBoxes() async {
   DatabaseHelper _db = DatabaseHelper.instance;
   final _boxes = await _db.queryAllBoxRows(DatabaseHelper.tableBoxes);
   _boxes.forEach((element) {
      print(element.boxName);
   });
   _boxListController.sink.add(boxes);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66061127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档