Wie erkenne ich, ob meine App mit Firebase verbunden ist?

1 Antwort

Anhand deiner Screenshots ist nicht ersichtlich, ob du die Variable database jemals irgendwo definierst. Die Fehlermeldung jedenfalls deutet an, dass du das nicht tust. So zeigt die Variable auf null. Dieses nicht-existente Objekt hat natürlich keine Methode getTodos.

dennisschmitt 
Fragesteller
 02.11.2020, 01:27
UserCredential result = await authenticate.signInAnonymously();

user = result.user;

database = DatabaseService(user.uid);

Mit dem Code wird es definiert, hatte ich in meiner Erklärung oben vergessen..

Der Konstruktor für die Database-Klasse benötigt nur einen String(uid)

0
regex9  02.11.2020, 02:51
@dennisschmitt

Und wird dieser Teil zu hundert Prozent vor dem ersten Aufruf von getTodos ausgeführt?

0
dennisschmitt 
Fragesteller
 02.11.2020, 03:02
@regex9

Ich kann die App leider nicht debuggen, sobald createState() => aufgerufen wird, springt er raus und gibt mir diese Meldung.

Future<void> connectToFirebase() async{
  //The firebase toolbox for authenticate
  final  FirebaseAuth authenticate = FirebaseAuth.instance;

  //Session is persist for this adivice, uid will stay the same
  UserCredential result = await authenticate.signInAnonymously();

  user = result.user;

  database = DatabaseService(user.uid);

  if(!(await database.checkIfUserExists())){
    database.setTodo("Todo anlegen", false);
    //ShowDialog machen
  }

  Stream userDocumentStream = database.getTodos();
  userDocumentStream.listen( (documentSnapshot) =>
      print(documentSnapshot.data) );
}

Das ist der Code der ganzen Methode

0
dennisschmitt 
Fragesteller
 02.11.2020, 03:08
@dennisschmitt
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text("To-Do-Liste"),
      centerTitle: mounted,
      backgroundColor: Color.fromRGBO(35, 152, 185, 100),),

    body: FutureBuilder(
        future: connectToFirebase(),
        builder: (BuildContext context, AsyncSnapshot snapshot){
          if(snapshot.connectionState == ConnectionState.waiting){
            return Center(child: CircularProgressIndicator());
          }else{
            return StreamBuilder<DocumentSnapshot>(
                stream: database.getTodos(),
                builder: (
                    context, AsyncSnapshot<DocumentSnapshot> snapshot) {
                  if (!snapshot.hasData) {
                    return Center(child: CircularProgressIndicator());
                  } else {
                    Map<String, dynamic> items = snapshot.data.data();
                    return ListView.builder(

es wird die getTodos() allerdings hier auch aufgerufen. Ich weiß, nicht was zuerst verarbeitet wird

0
regex9  02.11.2020, 03:39
@dennisschmitt

future (wo du die Instanz erst definierst) wird asynchron irgendwann aufgerufen. Also wohl viel später, als der erste Aufruf des builder-Callbacks erfolgt. Erstelle das database-Objekt am besten schon beim Anlegen der Klasse _NewTaskState (?).

0
dennisschmitt 
Fragesteller
 02.11.2020, 03:52
@regex9

Dann kommen weitere Fehler bezüglich der Instanz und ich kann await nicht mehr verwenden, da dies mit async zusammen benutzt wird..

0
dennisschmitt 
Fragesteller
 02.11.2020, 08:24
@dennisschmitt

Der Fehler entsteht laut der Konsole in der Zeile:

stream: database.getTodos()

dabei ist wartet der FutureBuilder ja auf die Methode connectToFirebase(), welche ich oben bereits geschickt habe.

Also ist doch etwas in dieser Methode falsch..?

0
regex9  02.11.2020, 09:06
@dennisschmitt

Folgende Fehler bedeuten im Umkehrschluss nicht zwingend, dass die vorherige Korrektur falsch war. Ein Fix kann auch mehrere notwendige Änderungen mit sich ziehen.

1
dennisschmitt 
Fragesteller
 02.11.2020, 09:25
@regex9

Ich habe ein wenig debuggt, es hat sich gezeigt, dass er einmal kurz in die connectToFirebase() springt aber nach der ersten Zeile direkt wieder rausspringt. Weshalb er dann im Scaffold auch den FutureBuilder komplett überspringt. Ich weiß allerdings nicht wieso.

0