2017-12-26 18 views
0

Ich versuche ein Widget zu aktualisieren, wenn ich Daten aus meiner Datenbank habe. Das Widget, das ich versuche, als Klassenvariable definiert zu ändern:Status nicht aktualisiert

Widget openFriendRequestNotificationWidget = new Container(); 

ich einen leeren Behälter bin mit, weil ich nicht wirklich etwas am Anfang machen müssen und es auf null zu verlassen ist nicht Möglichkeit.
Ich habe zwei Funktionen habe, eine meiner Seite und die andere das Update mein openFriendRequestNotificationWidget zu erstellen:

Widget createFriendsPage() { 
    if (currentUser.friends == null) { 
     return new Column(
     mainAxisAlignment: MainAxisAlignment.center, 
     children: <Widget>[ 
      openFriendRequestNotificationWidget, 
      new Material(
       child: new InkWell(
       child: new Center(
        child: new Text("Woops, looks like you have no friends yet.\nTap here to find some!", textAlign: TextAlign.center,), 
       ), 
       onTap:() => createFriendsDialog(), 
      ) 
     ) 
     ], 
    ); 
    } 
    return new Column(
     children: <Widget>[ 
     openFriendRequestNotificationWidget, 
     new Text("ok") 
     ], 
    ); 
    } 

    void createReceivedFriendRequestsNotification() { 
    FirebaseDatabase.instance.reference().child("friend_requests").child(currentUser.uid).once().then((DataSnapshot snap) { 
     Map<String, Map<String, String>> response = snap.value; 
     if (response != null) { 
     this.setState(() { 
      print("Changing widget"); 
      openFriendRequestNotificationWidget = new Container(
      child: new Text("You've got ${response.length.toString()} new friend requests!"), 
      color: Colors.black, 
     ); 
     }); 
     } 
    }); 
    } 

Die Variable wird die Aktualisierung in createReceivedFriendRequestsNotification aber es wird nicht wieder Rendering.
Könnte jemand aushelfen?

+0

Ihre createFriendsPage in der Überschreibung Methode aufrufen https://github.com/flutter/flutter/issues/9614 – grepLines

+0

wo Sie 'createFriendsPage()' nennen? – grepLines

+0

Danke dafür! Ich verstehe, dass, weil ich eine Spalte verwende, die eine Liste nimmt, das Widget nicht neu erstellt, weil die Liste immer noch dieselben Variablen enthält, obwohl ich eine geändert habe (korrigiere mich, wenn ich falsch liege!). Wie könnte ich das beheben? Ich brauche eine Liste für die Widgets der Spalte, nein? –

Antwort

1

Wenn Sie createFriendsPage in initState() aufrufen, dann bedeutet das, dass der Code innerhalb initState() nur einmal aufgerufen wird, um die UI zu erstellen. Wenn es möglich ist, schlage ich vor, dass Sie build()

class FriendPage extends StatefullWidget{ 
      //instantiate your state .. } 

    class FriendsPageState extends State<FriendPage> { 
     @override 
     Widget build(Build context) { 
       return cteateFriendsPage(); 
     } 

     //other methods here ... 
    } 
+0

Ich konnte 'createFriendsPage()' nicht einfach wegen meiner App-Struktur zurückgeben. Aber die Idee, die Methode nicht in 'initState()' aufzurufen, hat es funktioniert! –

Verwandte Themen