FutureBuilder показывает ошибку перед отображением результата - PullRequest
0 голосов
/ 08 января 2020

Мой Future Builder выдает ошибку в течение нескольких секунд на экране, а затем показывает, что результат вот в журналах ошибок:

The following NoSuchMethodError was thrown building FutureBuilder<DocumentSnapshot>(dirty, state: _FutureBuilderState<DocumentSnapshot>#fd0c5):
The method '[]' was called on null.
Receiver: null
Tried calling: []("title")

The relevant error-causing widget was: 
  FutureBuilder<DocumentSnapshot> file:///C:/Users/Admin/Desktop/Android/doorstep/lib/domain/repository/booking-repository.dart:7:12
When the exception was thrown, this was the stack: 
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
#1      BookingRepository.getTitle.<anonymous closure> (package:doorstep/domain/repository/booking-repository.dart:11:39)
#2      _FutureBuilderState.build (package:flutter/src/widgets/async.dart)
#3      StatefulElement.build (package:flutter/src/widgets/framework.dart:4334:27)
#4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4223:15)

Код

Widget getTitle(String id) {
  return FutureBuilder(
    future: Firestore.instance.collection('products').document(id).get(),
    builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot){
      return ListTile(
        title: Text("${snapshot.data['title'].toString()}"),
      );
    }
  );
}

Ответы [ 3 ]

1 голос
/ 08 января 2020

Прежде чем пытаться отобразить его, необходимо проверить, есть ли на снимке данные, в соответствии с документацией :

builder: (BuildContext context, AsyncSnapshot snapshot) {
  if (snapshot.hasData) {
    // return something
  } else if (snapshot.hasError) {
    // Manage error
  } else {
    // return something for the user to wait
  }
}
1 голос
/ 08 января 2020

Попробуйте

FutureBuilder<AsyncSnapshot<DocumentSnapshot>>(
        builder: (context, snap) {
          if (snap.connectionState != ConnectionState.done) {
            //print('project snapshot data is: ${snap.data}');
            return Text("loading");
          } else {
            if (snap.hasError) {
              return Text([snap.error.toString()]); 
            }
            else {
              if (snap.hasData) {


                return Text("${snap.data['title'].toString()}");
              } else {
                return Text("No DAta");
              }
            }
          }
        },
        future:
        Firestore.instance.collection('products').document(id).get(),
    );
0 голосов
/ 08 января 2020

Если вы не предоставите никаких данных для initialData: параметра FutureBuilder, вы получите нулевое значение, когда FutureBuilder вставлено в дерево виджетов.

Также в builder: из FutureBuilder

builder: (BuildContext context, AsyncSnapshot snapshot) {
    if(snapshot.hasData){ // <-- check this before using data. true if it has data false if null.

    } else {

    }
}

Надеюсь, это поможет, в случае каких-либо сомнений, пожалуйста, прокомментируйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...