227 lines
6.3 KiB
Dart
227 lines
6.3 KiB
Dart
// 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_facebook_login/flutter_facebook_login.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:google_sign_in/google_sign_in.dart';
|
|
|
|
GoogleSignIn _googleSignIn = GoogleSignIn(
|
|
clientId: "1051330489903-on15f3rmq3a1830f2cb3d7ber0duueqh.apps.googleusercontent.com",
|
|
//clientId: "1051330489903-on15f3rmq3a1830f2cb3d7ber0duueqh.apps.googleusercontent.com"
|
|
);
|
|
|
|
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(_currentUser);
|
|
}
|
|
});
|
|
_googleSignIn.signInSilently();
|
|
}
|
|
|
|
Future<void> _handleGetContact(GoogleSignInAccount user) async {
|
|
setState(() {
|
|
_contactText = "Loading contact info...";
|
|
});
|
|
// final http.Response response = await http.get(
|
|
// Uri.parse('https://people.googleapis.com/v1/people/me/connections'
|
|
// '?requestMask.includeField=person.names'),
|
|
// headers: await user.authHeaders,
|
|
// );
|
|
// if (response.statusCode != 200) {
|
|
// print("Success ------> 200");
|
|
// setState(() {
|
|
// _contactText = "People API gave a ${response.statusCode} "
|
|
// "response. Check logs for details.";
|
|
// });
|
|
// print('People API ${response.statusCode} response: ${response.body}');
|
|
// return;
|
|
// }
|
|
// final Map<String, dynamic> data = json.decode(response.body);
|
|
// print("data $data");
|
|
// final String namedContact = _pickFirstNamedContact(data);
|
|
// setState(() {
|
|
// if (namedContact != null) {
|
|
// _contactText = "I see you know $namedContact!";
|
|
// } else {
|
|
// _contactText = "No contacts to display.";
|
|
// }
|
|
// });
|
|
}
|
|
|
|
String _pickFirstNamedContact(Map<String, dynamic> data) {
|
|
final List<dynamic> connections = data['connections'];
|
|
final Map<String, dynamic> contact = connections?.firstWhere(
|
|
(dynamic contact) => contact['names'] != null,
|
|
orElse: () => null,
|
|
);
|
|
if (contact != null) {
|
|
final Map<String, dynamic> name = contact['names'].firstWhere(
|
|
(dynamic name) => name['displayName'] != null,
|
|
orElse: () => null,
|
|
);
|
|
if (name != null) {
|
|
return name['displayName'];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
Future<void> _handleSignIn() async {
|
|
try {
|
|
await _googleSignIn.signIn().then((value){
|
|
print(value);
|
|
});
|
|
} catch (error) {
|
|
print(error);
|
|
}
|
|
}
|
|
|
|
Future<void> _handleSignOut() => _googleSignIn.disconnect();
|
|
|
|
Widget _buildBody() {
|
|
GoogleSignInAccount user = _currentUser;
|
|
if (user != null) {
|
|
return Column(
|
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
|
children: <Widget>[
|
|
ListTile(
|
|
leading: GoogleUserCircleAvatar(
|
|
identity: user,
|
|
),
|
|
title: Text(user.displayName ?? ''),
|
|
subtitle: Text(user.email),
|
|
),
|
|
const Text("Signed in successfully."),
|
|
Text(_contactText),
|
|
ElevatedButton(
|
|
child: const Text('SIGN OUT'),
|
|
onPressed: _handleSignOut,
|
|
),
|
|
ElevatedButton(
|
|
child: const Text('REFRESH'),
|
|
onPressed: () => _handleGetContact(user),
|
|
),
|
|
],
|
|
);
|
|
} else {
|
|
return Column(
|
|
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
|
children: <Widget>[
|
|
const Text("You are not currently signed in."),
|
|
ElevatedButton(
|
|
child: const Text('SIGN IN'),
|
|
onPressed: _handleSignIn,
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
//shower message for facebook
|
|
|
|
static final FacebookLogin facebookSignIn = new FacebookLogin();
|
|
String _message = 'Log in/out by pressing the buttons below.';
|
|
|
|
Future<Null> _login() async {
|
|
final FacebookLoginResult result =
|
|
await facebookSignIn.logIn(['email','public_profile']);
|
|
|
|
print(result.accessToken.token);
|
|
switch (result.status) {
|
|
case FacebookLoginStatus.loggedIn:
|
|
final FacebookAccessToken accessToken = result.accessToken;
|
|
_showMessages('''
|
|
Logged in!
|
|
|
|
Token: ${accessToken.token}
|
|
User id: ${accessToken.userId}
|
|
Expires: ${accessToken.expires}
|
|
Permissions: ${accessToken.permissions}
|
|
Declined permissions: ${accessToken.declinedPermissions}
|
|
''');
|
|
break;
|
|
case FacebookLoginStatus.cancelledByUser:
|
|
_showMessages('Login cancelled by the user.');
|
|
break;
|
|
case FacebookLoginStatus.error:
|
|
_showMessages('Something went wrong with the login process.\n'
|
|
'Here\'s the error Facebook gave us: ${result.errorMessage}');
|
|
break;
|
|
}
|
|
}
|
|
|
|
Future<Null> _logOut() async {
|
|
await facebookSignIn.logOut();
|
|
_showMessages('Logged out.');
|
|
}
|
|
|
|
void _showMessages(String message) {
|
|
setState(() {
|
|
_message = message;
|
|
});
|
|
}
|
|
|
|
void _showMessage(String message) {
|
|
setState(() {
|
|
_message = message;
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: const Text('Google Sign In'),
|
|
),
|
|
body: ConstrainedBox(
|
|
constraints: const BoxConstraints.expand(),
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: <Widget>[
|
|
_buildBody(),
|
|
Text(_message),
|
|
RaisedButton(
|
|
onPressed: _login,
|
|
child: Text('Log in'),
|
|
),
|
|
RaisedButton(
|
|
onPressed: _logOut,
|
|
child: new Text('Logout'),
|
|
),
|
|
],
|
|
),
|
|
));
|
|
}
|
|
}
|