| // Copyright 2019 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // ignore_for_file: public_member_api_docs |
| |
| import 'dart:async'; |
| |
| import 'package:flutter/material.dart'; |
| import 'package:google_sign_in/google_sign_in.dart'; |
| |
| import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart'; |
| import 'package:googleapis/people/v1.dart'; |
| |
| GoogleSignIn _googleSignIn = GoogleSignIn( |
| scopes: <String>[ |
| 'email', |
| 'https://www.googleapis.com/auth/contacts.readonly', |
| ], |
| ); |
| |
| void main() { |
| runApp( |
| MaterialApp( |
| title: 'Google Sign In', |
| home: SignInDemo(), |
| ), |
| ); |
| } |
| |
| class SignInDemo extends StatefulWidget { |
| @override |
| State createState() => SignInDemoState(); |
| } |
| |
| class SignInDemoState extends State<SignInDemo> { |
| GoogleSignInAccount _currentUser; |
| String _contactText; |
| |
| @override |
| void initState() { |
| super.initState(); |
| _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) { |
| setState(() { |
| _currentUser = account; |
| }); |
| if (_currentUser != null) { |
| _handleGetContact(); |
| } |
| }); |
| _googleSignIn.signInSilently(); |
| } |
| |
| Future<void> _handleGetContact() async { |
| setState(() { |
| _contactText = 'Loading contact info...'; |
| }); |
| |
| final peopleApi = PeopleApi(await _googleSignIn.authenticatedClient()); |
| final response = await peopleApi.people.connections.list( |
| 'people/me', |
| personFields: 'names', |
| ); |
| |
| final firstNamedContactName = _pickFirstNamedContact(response.connections); |
| |
| setState(() { |
| if (firstNamedContactName != null) { |
| _contactText = 'I see you know $firstNamedContactName!'; |
| } else { |
| _contactText = 'No contacts to display.'; |
| } |
| }); |
| } |
| |
| String _pickFirstNamedContact(List<Person> connections) { |
| return connections |
| ?.firstWhere( |
| (person) => person.names != null, |
| orElse: () => null, |
| ) |
| ?.names |
| ?.firstWhere( |
| (name) => name.displayName != null, |
| orElse: () => null, |
| ) |
| ?.displayName; |
| } |
| |
| Future<void> _handleSignIn() async { |
| try { |
| await _googleSignIn.signIn(); |
| } catch (error) { |
| print(error); |
| } |
| } |
| |
| Future<void> _handleSignOut() => _googleSignIn.disconnect(); |
| |
| Widget _buildBody() { |
| if (_currentUser != null) { |
| return Column( |
| mainAxisAlignment: MainAxisAlignment.spaceAround, |
| children: <Widget>[ |
| ListTile( |
| leading: GoogleUserCircleAvatar( |
| identity: _currentUser, |
| ), |
| title: Text(_currentUser.displayName ?? ''), |
| subtitle: Text(_currentUser.email ?? ''), |
| ), |
| const Text('Signed in successfully.'), |
| Text(_contactText ?? ''), |
| RaisedButton( |
| child: const Text('SIGN OUT'), |
| onPressed: _handleSignOut, |
| ), |
| RaisedButton( |
| child: const Text('REFRESH'), |
| onPressed: _handleGetContact, |
| ), |
| ], |
| ); |
| } else { |
| return Column( |
| mainAxisAlignment: MainAxisAlignment.spaceAround, |
| children: <Widget>[ |
| const Text('You are not currently signed in.'), |
| RaisedButton( |
| child: const Text('SIGN IN'), |
| onPressed: _handleSignIn, |
| ), |
| ], |
| ); |
| } |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| return Scaffold( |
| appBar: AppBar( |
| title: const Text('Google Sign In'), |
| ), |
| body: ConstrainedBox( |
| constraints: const BoxConstraints.expand(), |
| child: _buildBody(), |
| )); |
| } |
| } |