Значение восстанавливается только после горячей перезагрузки в флаттере - PullRequest
0 голосов
/ 09 февраля 2020

Я немного новичок, я создаю небольшое приложение, использующее Firebase в качестве бэкэнда, всякий раз, когда я пытаюсь загрузить данные из Firebase, я не могу получить значение, пока я не перезагружу приложение, это не Разве весь код, я думаю, что виджеты загружаются раньше, чем сами данные, действительно может использовать вашу помощь, есть ли способ использовать состояние для обновления sh значения?

mycode:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import "package:flutter/material.dart";
import 'package:mine_app/textingpage.dart';

class FriendsPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _FriendsPage();
  }
}

class Friends {
  final int theirTexts;
  final String username;
  final int  myTexts;
  final int totalTexts;
  final String friendId;

  Friends(this.theirTexts,this.totalTexts,this.username,this.myTexts,this.friendId);

  Friends.fromMap(DocumentSnapshot map)
    :assert(map["username"]!=null),
    assert(map["myTexts"]!=null),
    assert(map["theirTexts"]!=null),
    assert(map["totalTexts"]!=null),
    assert(map["uid"]!=null),
    username = map["username"],
    myTexts = map["myTexts"],
    theirTexts = map["theirTexts"],
    totalTexts = map["totalTexts"],
    friendId = map["uid"];
}


class _FriendsPage extends State<FriendsPage> {
  String user;
  String globalid = "";

  Future<void> getuser() async {
    user = (await FirebaseAuth.instance.currentUser()).uid;
  }

  @override
  void initState() {
    getuser();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 2,
      child: Scaffold(
          appBar: AppBar(
            backgroundColor: Color(0xff723881),
            centerTitle: true,
            title: Text(
              "Chats",
            bottom: TabBar(
              tabs: [
                Tab(icon: Icon(Icons.people), text: "People"),
                Tab(icon: Icon(Icons.search), text: "Find"),
              ],
              indicatorColor: Colors.white,
            ),
          ),
          body: TabBarView(
            children: <Widget>[
              Container(
                child: snapShotBuilder(context)
              ),
              Container()
            ],
          )),
    );
  }

  Widget snapShotBuilder(BuildContext context){
    return StreamBuilder<QuerySnapshot>(
      stream: Firestore.instance.collection("users").document(user).collection("friends").snapshots(),
      builder:(context,snapshot){
        if (!snapshot.hasData) {
          return LinearProgressIndicator();
        }
          return myListView(context,snapshot.data.documents); 
    } );
  }

  Widget myListView(BuildContext context,List<DocumentSnapshot> snapshot){
    return Container(
      child: ListView(
        children: snapshot.map((data)=>myfriends(Friends.fromMap(data))).toList(),
      ),
    );
  }

  Widget myfriends(Friends friend) {
    return Container(
      margin: EdgeInsets.only(top: 10.0),
      padding: EdgeInsets.all(5.0),
      child: ListTile(
        onTap:(){
          setState(() {
            globalid = friend.friendId;
          });
          print(friend.friendId);
          Navigator.push(context, MaterialPageRoute(builder: (context)=>ChatPage(userid:friend.friendId)));
        },
        trailing: Container(
            // margin: EdgeInsets.only(top:30.0,left:10.0,right:0.0),
            child: Text(
          friend.totalTexts.toString(),),
        leading: Container(
          width: 60.0,
          height: 60.0,
        ),
        title: Text(friend.username,),
      ),
    );
  }
}

1 Ответ

1 голос
/ 09 февраля 2020

Вам нужно установить setState () в getUser (), а также проверить, есть ли у снимка данные или нет. Поэтому измененный код будет

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import "package:flutter/material.dart";
import 'package:mine_app/textingpage.dart';

class FriendsPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _FriendsPage();
  }
}

class Friends {
  final int theirTexts;
  final String username;
  final int  myTexts;
  final int totalTexts;
  final String friendId;

  Friends(this.theirTexts,this.totalTexts,this.username,this.myTexts,this.friendId);

  Friends.fromMap(DocumentSnapshot map)
    :assert(map["username"]!=null),
    assert(map["myTexts"]!=null),
    assert(map["theirTexts"]!=null),
    assert(map["totalTexts"]!=null),
    assert(map["uid"]!=null),
    username = map["username"],
    myTexts = map["myTexts"],
    theirTexts = map["theirTexts"],
    totalTexts = map["totalTexts"],
    friendId = map["uid"];
}


class _FriendsPage extends State<FriendsPage> {
  String user;
  String globalid = "";

  Future<void> getuser() async{
    setState((){
       user = (await FirebaseAuth.instance.currentUser()).uid;
    });
  }

  @override
  void initState() {
    getuser();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 2,
      child: Scaffold(
          appBar: AppBar(
            backgroundColor: Color(0xff723881),
            centerTitle: true,
            title: Text(
              "Chats",
            bottom: TabBar(
              tabs: [
                Tab(icon: Icon(Icons.people), text: "People"),
                Tab(icon: Icon(Icons.search), text: "Find"),
              ],
              indicatorColor: Colors.white,
            ),
          ),
          body: TabBarView(
            children: <Widget>[
              Container(
                child: snapShotBuilder(context)
              ),
              Container()
            ],
          )),
    );
  }

  Widget snapShotBuilder(BuildContext context){
    return StreamBuilder<QuerySnapshot>(
      stream: Firestore.instance.collection("users").document(user).collection("friends").snapshots(),
      builder:(context,snapshot){
        if (snapshot.hasData) {
          return myListView(context,snapshot.data.documents); 
        }else if(snapshot.hasError){
          return Center(
          child:Text(snapshot.error.toString()));
        }else{
          return LinearProgressIndicator();
        }

    } );
  }

  Widget myListView(BuildContext context,List<DocumentSnapshot> snapshot){
    return Container(
      child: ListView(
        children: snapshot.map((data)=>myfriends(Friends.fromMap(data))).toList(),
      ),
    );
  }

  Widget myfriends(Friends friend) {
    return Container(
      margin: EdgeInsets.only(top: 10.0),
      padding: EdgeInsets.all(5.0),
      child: ListTile(
        onTap:(){
          setState(() {
            globalid = friend.friendId;
          });
          print(friend.friendId);
          Navigator.push(context, MaterialPageRoute(builder: (context)=>ChatPage(userid:friend.friendId)));
        },
        trailing: Container(
            // margin: EdgeInsets.only(top:30.0,left:10.0,right:0.0),
            child: Text(
          friend.totalTexts.toString(),),
        leading: Container(
          width: 60.0,
          height: 60.0,
        ),
        title: Text(friend.username,),
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...