Firebase 颤振:应用程序在使用StreamBuilder时无声崩溃

Firebase 颤振:应用程序在使用StreamBuilder时无声崩溃,firebase,flutter,stream,crash,stream-builder,Firebase,Flutter,Stream,Crash,Stream Builder,我正试图找出我的StreamBuilder/Stream的问题是什么: Stream<Page> pageStream; @override void initState() { super.initState(); final firestoreService = Provider.of<FirestoreService>(context, listen: false); final book = Provider.of<Book>(conte

我正试图找出我的StreamBuilder/Stream的问题是什么:

Stream<Page> pageStream;

@override
void initState() {
  super.initState();
  final firestoreService = Provider.of<FirestoreService>(context, listen: false);
  final book = Provider.of<Book>(context, listen: false);
  final pageNumber = Provider.of<int>(context, listen: false);
  pageStream = firestoreService.getStreamOfPage(bookId: book.bookId, pageNumber: pageNumber);
}

@override
Widget build(BuildContext context) {
  return StreamBuilder(
          stream: pageStream,
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting ||
                snapshot.connectionState == ConnectionState.none) {
              return CupertinoActivityIndicator();
            }

            if (snapshot.hasError) {
              return Text('the error is = ${snapshot.error.toString()}');
            }

            Page page = snapshot.data;

            return Container(
              color: Colors.purple,
              height: 30,
              width: 30,
            );
          }

  );
}
Stream<Page> getStreamOfPage(
    {@required String bookId, @required int pageNumber}) {
  try {
    Stream<Page> pageStream = _fireStore
        .document('books/$bookId/$pageNumber')
        .snapshots()
        .map((docSnapshot) => Page.fromMap(map: docSnapshot.data));
    return pageStream;
  } catch (e) {
    print(
        'Could not get stream of page with bookId = $bookId and pageNumber = $pageNumber');
    print(e);
    return null;
  }
}
Stream页面流;
@凌驾
void initState(){
super.initState();
final firestoreService=Provider.of(上下文,侦听:false);
final book=Provider.of(上下文,listen:false);
final pageNumber=Provider.of(上下文,侦听:false);
pageStream=firestoreService.getStreamOfPage(bookId:book.bookId,页码:pageNumber);
}
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:页面流,
生成器:(上下文,快照){
如果(snapshot.connectionState==connectionState.waiting||
snapshot.connectionState==connectionState.none){
返回CupertinoActivityIndicator();
}
if(snapshot.hasError){
返回文本('error is=${snapshot.error.toString()}');
}
Page=snapshot.data;
返回容器(
颜色:颜色,紫色,
身高:30,
宽度:30,
);
}
);
}
因此,在initstate方法中,我得到了存储在状态中的流,然后将其分配给StreamBuilder

获取流的方法是:

Stream<Page> pageStream;

@override
void initState() {
  super.initState();
  final firestoreService = Provider.of<FirestoreService>(context, listen: false);
  final book = Provider.of<Book>(context, listen: false);
  final pageNumber = Provider.of<int>(context, listen: false);
  pageStream = firestoreService.getStreamOfPage(bookId: book.bookId, pageNumber: pageNumber);
}

@override
Widget build(BuildContext context) {
  return StreamBuilder(
          stream: pageStream,
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting ||
                snapshot.connectionState == ConnectionState.none) {
              return CupertinoActivityIndicator();
            }

            if (snapshot.hasError) {
              return Text('the error is = ${snapshot.error.toString()}');
            }

            Page page = snapshot.data;

            return Container(
              color: Colors.purple,
              height: 30,
              width: 30,
            );
          }

  );
}
Stream<Page> getStreamOfPage(
    {@required String bookId, @required int pageNumber}) {
  try {
    Stream<Page> pageStream = _fireStore
        .document('books/$bookId/$pageNumber')
        .snapshots()
        .map((docSnapshot) => Page.fromMap(map: docSnapshot.data));
    return pageStream;
  } catch (e) {
    print(
        'Could not get stream of page with bookId = $bookId and pageNumber = $pageNumber');
    print(e);
    return null;
  }
}
Stream-getStreamOfPage(
{@required String bookId,@required int pageNumber}){
试一试{
Stream pageStream=\u fireStore
.document('books/$bookId/$pageNumber')
.快照()
.map((docSnapshot)=>Page.fromMap(map:docSnapshot.data));
返回页面流;
}捕获(e){
印刷品(
'无法获取bookId=$bookId和pageNumber=$pageNumber'的页面流';
印刷品(e);
返回null;
}
}
我在构造函数页面中编写的print语句。fromMap()已执行(包括构造函数末尾的一条语句),因此我假设错误不在那里。 我在map方法(from.snapshots().map(…)中添加的Print语句没有执行,这对我来说没有任何意义,因为页面构造函数中的语句已执行(使用firebase文档中的正确值)

调用堆栈如下所示:

*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff23c7127e __exceptionPreprocess + 350
    1   libobjc.A.dylib                     0x00007fff513fbb20 objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff23c70ff8 +[NSException raise:format:arguments:] + 88
    3   Foundation                          0x00007fff256e9c1a -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:] + 166
    4   Runner                              0x00000001018ca524 _ZN8firebase9firestore4util16ObjcThrowHandlerENS1_13ExceptionTypeEPKcS4_iRKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE + 356
    5   Runner                              0x00000001018c9d63 _ZN8firebase9firestore4util5ThrowENS1_13Except<…>
***第一次抛出调用堆栈:
(
0 CoreFoundation 0x00007fff23c7127e例外预处理+350
1 libobjc.A.dylib 0x00007fff513fbb20 objc_异常_抛出+48
2 CoreFoundation 0x00007fff23c70ff8+[N异常提升:格式:参数:][88
3基金会0x000 7FFF256E9C1A- [ NSRealStutsHuffer-HuffLeaReuliFuff:Fix:No.No.No.:C:+] 166
4运行程序0x00000001018ca524 \u zn8 Firebase9 FireStore 4使用对象和参考文件1 \u 13例外类型EPKC4 \u iRKNSt3 \u 112基本\u 11严格字符跟踪许可证5 \u 9分配源代码EEE+356
5流道0x00000001018c9d63\u ZN8firebase9firestore4util5ThrowENS1\u 13除外

我找到了一种让它工作的方法。将获取流的函数更改为:

Stream<Page> getStreamOfPage(
      {@required String bookId, @required int pageNumber}) {
    try {
      Stream<Page> pageStream = _fireStore
          .document('books/$bookId')
          .collection('pages')
          .where('pageNumber', isEqualTo: pageNumber)
          .snapshots()
          .map((snap) => Page.fromMap(map: snap.documents[0]?.data));
      return pageStream;
    } catch (e) {
      print(
          'Could not get stream of page with bookId = $bookId and pageNumber = $pageNumber');
      print(e);
      return null;
    }
  }
Stream-getStreamOfPage(
{@required String bookId,@required int pageNumber}){
试一试{
Stream pageStream=\u fireStore
.document('books/$bookId')
.collection('页面')
.其中('pageNumber',isEqualTo:pageNumber)
.快照()
.map((snap)=>Page.fromMap(map:snap.documents[0]?.data));
返回页面流;
}捕获(e){
印刷品(
'无法获取bookId=$bookId和pageNumber=$pageNumber'的页面流';
印刷品(e);
返回null;
}
}
我不知道为什么旧版本不起作用