首页 > 解决方案 > null an 在 Flutter 中显示,但在 Future 中具有正确的值

问题描述

我是 Flutter 的新手,我无法解决这个问题。我有一个非常简单的应用程序。它只是用谷歌登录,在 Firebase 中创建了一个用户,该用户有一个计数器和一个按钮,这个按钮增加了计数器(int _user.count++)。

然后是我的问题:在下一个窗口中登录后,直到我单击“加号”按钮才能看到计数变量。变量是正确的,并且使用 fireStore 的查询工作得很好我得到了变量,但是如果我不点击按钮,我得到一个显示在变量“null”的位置。

非常感谢您的帮助和时间,我真的希望您能帮助我。也许这是一个小问题,我还没有找到有关它的信息,但是当一些人开始学习时就会发生这种情况。

MyDAO: Hier the Method Future 它负责对 FireStore 进行查询。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:gauth/user_model.dart';
import 'package:rxdart/rxdart.dart';

final UserDAO userDAO = UserDAO();

class UserDAO {


  final Firestore _db = Firestore.instance;
  PublishSubject loading;
  Observable<Future<QuerySnapshot>> profile;

  void updateData(UserModel user) async {
    DocumentReference documentReference =
        _db.collection("users").document(user.uid);
    return documentReference.setData({
      "uid": user.uid,
      "userName": user.name,
      "email": user.email,
      "photoUrl": user.photoUrl,
      "count": user.count,
      "lastIn": DateTime.now()
    }, merge: true);
  }

  Future<QuerySnapshot>  readDateFutur(String email) async {
    // loading.add(true);
    QuerySnapshot querySnapshot = await (_db
        .collection("users")
        .where("email", isEqualTo: email)
        .getDocuments());
    // loading.add(false);
    return querySnapshot;
  }

} 

在方法“void initState()”中,我持有变量_user.couner,它有效。

class PlusCounter extends StatefulWidget {
  UserModel user;
  PlusCounter(this.user);
  @override
  _PlusCounterState createState() => _PlusCounterState();
}

class _PlusCounterState extends State<PlusCounter> {
  UserModel _user;
  PublishSubject loading;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    setState(() {
      _user = widget.user;
      //loading.add(false);

      userDAO.readDateFutur(_user.email).then((QuerySnapshot docs) {
        if (docs.documents.isNotEmpty) {
          print("::::::::::NOESTOY VACIO:::::::::::::::::::::");
          print(docs.documents.last.data["count"]);
          if (docs.documents.last.data["count"] != null) {
            _user.count = docs.documents.last.data["count"];
          } else {
            _user.count = 0;
          }
        } else {
          print(":::::::::::ESTOY VACIO:::::::::::::::::");
          _user.count = 0;
        }
      });

    });
  }

  void _plus() {
    setState(() {
      _user.count++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Text("Cuantas veces te has \n lavado las manos:"),
        Text("${_user.count}"),
        MaterialButton(
          onPressed: () {
            _plus();
          },
          child: Text("Plus"),
          textColor: Colors.white,
          color: Colors.blue,
        ),
        MaterialButton(
          onPressed: () => userDAO.updateData(_user),
          child: Text("Guardar"),
          textColor: Colors.white,
          color: Colors.blue,
        ),
      ],
    );
  }
}

WelcomePage 代码就是这个。


class userDataWelcome extends StatelessWidget {
  UserModel _userModel;

  userDataWelcome(this._userModel);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Welcome"),
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            Center(
              child: Container(
                height: 100.0,
                width: 100.0,
                decoration: BoxDecoration(
                  shape: BoxShape.circle,
                  image: DecorationImage(
                    image: NetworkImage(_userModel.photoUrl),
                  ),
                ),
              ),
            ),
            Text("${_userModel.name}"),
            PlusCounter(_userModel),
            MaterialButton(
              onPressed: () => authService.SingOut(),
              child: Text("Logout"),
              textColor: Colors.white,
              color: Colors.deepOrange,
            )
          ],
        ),
      ),
    );
  }
}

然后我真的不知道为什么我需要单击“加号”按钮才能看到 _user.count 的值,因为否则我只会看到 null。再次,我想说谢谢你的帮助。

标签: firebasefluttergoogle-cloud-firestore

解决方案


initStat() _user.count = docs.documents.last.data["count"];尝试像setState((){});这样包装这一行

setState((){
_user.count = docs.documents.last.data["count"];
)};

推荐阅读