пустое отображение в флаттере, но с правильным значением в будущем - PullRequest
0 голосов
/ 08 апреля 2020

Я новичок во Флаттере и не могу решить эту проблему. У меня действительно простое приложение. это просто логин с гуглом а пользователь создан в Firebase, у этого пользователя есть счетчик и кнопка у этой кнопки увеличивает счетчик (int _user.count ++).

Тогда моя проблема: после входа в систему в В следующем окне не видна переменная count, пока я не нажму кнопку «плюс». переменная верна, и запрос с fireStore работает отлично. Я получил переменную, но если я не нажму кнопку, у меня появится переменная вместо «null».

Большое спасибо за помощь и время, я очень надеюсь, что вы можете мне помочь. возможно, это крошечная проблема, я не нашел информации об этом, но это случается, когда некоторые начинают учиться.

MyDAO: это метод будущего, за который отвечает запрос в 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. считать, потому что я просто вижу ноль в противном случае. просто еще раз хочу сказать спасибо за вашу помощь.

1 Ответ

0 голосов
/ 08 апреля 2020

Попробуйте обернуть эту строку в initStat() _user.count = docs.documents.last.data["count"]; в setState((){}); вот так

setState((){
_user.count = docs.documents.last.data["count"];
)};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...