Flutter LinkedIn登录插件linkedin_login的使用
Flutter LinkedIn登录插件linkedin_login的使用
简介
linkedin_login
是一个用于Flutter应用程序实现LinkedIn OAuth 2.0 API的库。它允许开发者轻松地集成LinkedIn登录功能,获取用户信息,并处理OAuth授权流程。
安装
请参阅 pub.dev上的安装说明。
重要提示
在使用此库之前,请确保替换以下值:
final String redirectUrl = 'YOUR-REDIRECT-URL';
final String clientId = 'YOUR-CLIENT-ID';
final String clientSecret = 'YOUR-CLIENT-SECRET';
注意:clientSecret
字段仅在 LinkedInUserWidget
中需要。
示例代码
下面是一个完整的示例demo,展示了如何使用 linkedin_login
插件进行LinkedIn登录和获取用户信息。
main.dart
import 'package:flutter/material.dart';
import 'package:linkedin_login/linkedin_login.dart';
// @TODO IMPORTANT - you need to change variable values below
// You need to add your own data from LinkedIn application
// From: https://www.linkedin.com/developers/
// Please read step 1 from this link https://developer.linkedin.com/docs/oauth2
const String redirectUrl = 'https://your-app/callback'; // 替换为你的回调URL
const String clientId = 'YOUR_CLIENT_ID'; // 替换为你的客户端ID
const String clientSecret = 'YOUR_CLIENT_SECRET'; // 替换为你的客户端密钥
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter LinkedIn demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: DefaultTabController(
length: 2,
child: Scaffold(
appBar: AppBar(
bottom: const TabBar(
tabs: [
Tab(icon: Icon(Icons.person), text: 'Profile'),
Tab(icon: Icon(Icons.text_fields), text: 'Auth code'),
],
),
title: const Text('LinkedIn Authorization'),
),
body: const TabBarView(
children: [
LinkedInProfileExamplePage(),
LinkedInAuthCodeExamplePage(),
],
),
),
),
);
}
}
class LinkedInProfileExamplePage extends StatefulWidget {
const LinkedInProfileExamplePage({super.key});
@override
State createState() => _LinkedInProfileExamplePageState();
}
class _LinkedInProfileExamplePageState extends State<LinkedInProfileExamplePage> {
UserObject? user;
bool logoutUser = false;
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
LinkedInButtonStandardWidget(
onTap: () {
Navigator.push(
context,
MaterialPageRoute<void>(
builder: (BuildContext context) => LinkedInUserWidget(
appBar: AppBar(
title: const Text('OAuth User'),
),
destroySession: logoutUser,
redirectUrl: redirectUrl,
clientId: clientId,
clientSecret: clientSecret,
onError: (UserFailedAction e) {
print('Error: ${e.toString()}');
print('Error: ${e.stackTrace.toString()}');
},
onGetUserProfile: (UserSucceededAction linkedInUser) {
print('Access token ${linkedInUser.user.token}');
print('User sub: ${linkedInUser.user.sub}');
user = UserObject(
firstName: linkedInUser.user.givenName,
lastName: linkedInUser.user.familyName,
email: linkedInUser.user.email,
profileImageUrl: linkedInUser.user.picture,
);
setState(() {
logoutUser = false;
});
Navigator.pop(context);
},
),
fullscreenDialog: true,
),
);
},
),
LinkedInButtonStandardWidget(
onTap: () {
setState(() {
user = null;
logoutUser = true;
});
},
buttonText: 'Logout',
),
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('First: ${user?.firstName} '),
Text('Last: ${user?.lastName} '),
Text('Email: ${user?.email}'),
Text('Profile image: ${user?.profileImageUrl}'),
],
),
],
),
);
}
}
class LinkedInAuthCodeExamplePage extends StatefulWidget {
const LinkedInAuthCodeExamplePage({super.key});
@override
State createState() => _LinkedInAuthCodeExamplePageState();
}
class _LinkedInAuthCodeExamplePageState extends State<LinkedInAuthCodeExamplePage> {
AuthCodeObject? authorizationCode;
bool logoutUser = false;
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
LinkedInButtonStandardWidget(
onTap: () {
Navigator.push(
context,
MaterialPageRoute<void>(
builder: (BuildContext context) => LinkedInAuthCodeWidget(
destroySession: logoutUser,
redirectUrl: redirectUrl,
clientId: clientId,
onError: (AuthorizationFailedAction e) {
print('Error: ${e.toString()}');
print('Error: ${e.stackTrace.toString()}');
},
onGetAuthCode: (AuthorizationSucceededAction response) {
print('Auth code ${response.codeResponse.code}');
print('State: ${response.codeResponse.state}');
authorizationCode = AuthCodeObject(
code: response.codeResponse.code,
state: response.codeResponse.state,
);
setState(() {});
Navigator.pop(context);
},
),
fullscreenDialog: true,
),
);
},
),
LinkedInButtonStandardWidget(
onTap: () {
setState(() {
authorizationCode = null;
logoutUser = true;
});
},
buttonText: 'Logout user',
),
Container(
margin: const EdgeInsets.symmetric(horizontal: 16),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Auth code: ${authorizationCode?.code} '),
Text('State: ${authorizationCode?.state} '),
],
),
),
],
);
}
}
class AuthCodeObject {
AuthCodeObject({required this.code, required this.state});
final String? code;
final String? state;
}
class UserObject {
UserObject({
required this.firstName,
required this.lastName,
required this.email,
required this.profileImageUrl,
});
final String? firstName;
final String? lastName;
final String? email;
final String? profileImageUrl;
}
关键点说明
- 配置LinkedIn应用:你需要在LinkedIn开发者平台创建一个应用,并获取
clientId
、clientSecret
和redirectUrl
。 - LinkedInUserWidget:用于获取用户的完整信息,包括姓名、电子邮件和头像等。
- LinkedInAuthCodeWidget:用于仅获取授权码,适用于只需要授权而不直接获取用户信息的场景。
- 登出用户:通过设置
destroySession
为true
来清除会话并登出用户。
希望这个示例能帮助你更好地理解和使用 linkedin_login
插件。如果你有任何问题或需要进一步的帮助,请随时提问!
更多关于Flutter LinkedIn登录插件linkedin_login的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter LinkedIn登录插件linkedin_login的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter应用中使用linkedin_login
插件来实现LinkedIn登录的示例代码。
首先,你需要在pubspec.yaml
文件中添加linkedin_login
依赖:
dependencies:
flutter:
sdk: flutter
linkedin_login: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,你需要配置LinkedIn开发者平台,获取你的客户端ID和客户端密钥,并设置重定向URI。确保在LinkedIn开发者平台上设置的包名与你的Flutter应用的包名一致。
在你的Flutter项目中,你可以按照以下步骤实现LinkedIn登录:
-
配置LinkedIn SDK:
在你的
android/app/src/main/AndroidManifest.xml
文件中添加LinkedIn SDK所需的权限和配置:<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.yourapp"> <!-- LinkedIn SDK permissions --> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application ...> <!-- LinkedIn SDK configuration --> <meta-data android:name="com.linkedin.sdk.android.APP_ID" android:value="your_linkedin_app_id"/> <!-- 替换为你的LinkedIn应用ID --> </application> </manifest>
-
实现LinkedIn登录逻辑:
在你的Flutter代码中,你可以这样实现LinkedIn登录:
import 'package:flutter/material.dart'; import 'package:linkedin_login/linkedin_login.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: LinkedInLoginPage(), ); } } class LinkedInLoginPage extends StatefulWidget { @override _LinkedInLoginPageState createState() => _LinkedInLoginPageState(); } class _LinkedInLoginPageState extends State<LinkedInLoginPage> { final LinkedInLogin _linkedInLogin = LinkedInLogin( clientId: 'your_linkedin_client_id', // 替换为你的LinkedIn客户端ID clientSecret: 'your_linkedin_client_secret', // 替换为你的LinkedIn客户端密钥 redirectUri: 'linkedin://success', // LinkedIn重定向URI,需要在LinkedIn开发者平台上配置 state: 'DCFSDF4545ASDFSF', // 一个唯一的状态字符串,用于防止CSRF攻击 ); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('LinkedIn Login Example'), ), body: Center( child: ElevatedButton( onPressed: () async { try { final LinkedInUser user = await _linkedInLogin.login(); print('LinkedIn User: ${user.toJson()}'); } catch (e) { print('Error during LinkedIn login: $e'); } }, child: Text('Login with LinkedIn'), ), ), ); } } // LinkedInUser 类定义(假设LinkedInLogin插件返回的数据结构) class LinkedInUser { String id; String firstName; String lastName; String profilePictureUrl; LinkedInUser({ required this.id, required this.firstName, required this.lastName, required this.profilePictureUrl, }); Map<String, dynamic> toJson() { return { 'id': id, 'firstName': firstName, 'lastName': lastName, 'profilePictureUrl': profilePictureUrl, }; } }
请注意,LinkedInUser
类是基于假设的数据结构定义的,实际使用时你可能需要根据linkedin_login
插件返回的实际数据结构进行调整。
另外,由于LinkedIn API和SDK的更新,上述代码可能需要根据最新的linkedin_login
插件文档和LinkedIn开发者平台的指南进行调整。确保查阅最新的文档和指南以获取最准确的信息。