Начальное состояние потока - ConnectionState.waiting вместо null - PullRequest
0 голосов
/ 17 мая 2018
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';

final FirebaseAuth _auth = FirebaseAuth.instance;
final GoogleSignIn _googleSignIn = new GoogleSignIn();

class HomePage extends StatefulWidget {
  static String tag = 'home-page';

  @override
  HomePageState createState() {
    return new HomePageState();
  }
}

class HomePageState extends State<HomePage> {
  Stream<FirebaseUser> _currentUser;

  Future<FirebaseUser> signInWithGoogle() async {
    print('google signin invoked');

    GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    GoogleSignInAuthentication googleAuth = await googleUser.authentication;
    FirebaseUser user = await _auth.signInWithGoogle(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    print("signed in " + user.displayName);

    return user;
  }

  @override
  Widget build(BuildContext context) {
    final lblWelcome = Padding(
        padding: EdgeInsets.all(8.0),
        child: Text('Frnds Payment',
            style: TextStyle(fontSize: 28.0, color: Colors.green)));

    final btnSignin = new MaterialButton(
        child: const Text('Sign In with Google'),
        onPressed: () {
          print('button clicked');
          _currentUser = signInWithGoogle()?.asStream();
        });
    final txtOutput = new StreamBuilder<FirebaseUser>(
        stream: _currentUser,
        builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
          switch (snapshot.connectionState) {
            case ConnectionState.none:
            case ConnectionState.waiting:
              return new Center(child: new CircularProgressIndicator());
            default:
              if (snapshot.hasError)
                return new Text('Error: ${snapshot.error}');
              else
                return new Center(
                    child: new Text('${snapshot.data.displayName}'));
          }
        });

    final body = Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[lblWelcome, btnSignin, txtOutput],
      ),
    );

    return Scaffold(body: body);
  }
}

Я новичок в Дарт, это мое первое приложение.Мне нужно отобразить имя пользователя после успешного входа.

Каждый раз, когда я запускаю приложение, оно переходит в ConnectionState.waiting вместо ConnectionState.none.

Также не отображается текстовое поле с отображаемым именемна успешном входе.перезагрузка отображает отображаемое имя.

1 Ответ

0 голосов
/ 17 мая 2018

ConnectionState.none означает, что нет назначенного потока, но у вас есть

setState(() => _currentUser = signInWithGoogle()?.asStream());

, это означает, что StreamBuilder подписан на этот поток и ожидает событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...