Flutter华为账号集成插件huawei_account的使用
Flutter华为账号集成插件huawei_account的使用
概述
Flutter华为账号集成插件huawei_account
允许您的应用通过华为账号SDK与Flutter平台进行通信。这使得用户可以快速方便地通过华为账号的双因素认证进行登录。
安装
请访问 pub.dev 和 AppGallery Connect Configuration 获取详细的安装指南。
文档
问题或建议
如果您在使用HMS样本时遇到任何问题,可以尝试以下途径:
- 在 Stack Overflow 提问,并确保使用标签
<strong>huawei-mobile-services</strong>
。 - 在 GitHub 提交问题或提交您的想法。
- 在 华为开发者论坛 发帖寻求一般性问题的帮助或推荐。
- 访问 华为开发者文档 查看所有HMS核心工具的官方文档。
如果在样本中发现任何bug,请提交到 GitHub仓库。
许可证
华为账号Flutter插件遵循 Apache 2.0许可证。
示例代码
以下是完整的示例代码,展示了如何在Flutter应用中使用huawei_account
插件。
/*
Copyright 2020-2024. Huawei Technologies Co., Ltd. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License")
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:huawei_account/huawei_account.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
]);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: AuthScreen(),
);
}
}
class AuthScreen extends StatefulWidget {
const AuthScreen({Key? key}) : super(key: key);
[@override](/user/override)
State<AuthScreen> createState() => _AuthScreenState();
}
class _AuthScreenState extends State<AuthScreen> {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final List<String> _logs = [];
late AccountAuthService _authService;
late ScrollController controller;
[@override](/user/override)
void initState() {
controller = ScrollController();
final AccountAuthParamsHelper authParamsHelper = AccountAuthParamsHelper()
..setProfile()
..setAccessToken();
final AccountAuthParams authParams = authParamsHelper.createParams();
_authService = AccountAuthManager.getService(authParams);
super.initState();
}
[@override](/user/override)
void dispose() {
controller.dispose();
super.dispose();
}
Widget _buildAuthButton(String text, VoidCallback callback) {
return Container(
width: double.infinity,
padding: EdgeInsets.zero,
margin: const EdgeInsets.fromLTRB(15, 15, 15, 0),
decoration: BoxDecoration(
border: Border.all(width: 1, color: Colors.black),
borderRadius: BorderRadius.circular(8),
),
child: ElevatedButton(
onPressed: callback,
style: ElevatedButton.styleFrom(
foregroundColor: Colors.black,
backgroundColor: Colors.white,
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(2),
),
padding: const EdgeInsets.symmetric(
vertical: 12,
horizontal: 25,
),
),
child: Text(text.toUpperCase()),
),
);
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
backgroundColor: Colors.white,
appBar: AppBar(
title: const Text(
'华为账号Demo',
style: TextStyle(color: Colors.black),
),
backgroundColor: Colors.white,
elevation: 2,
),
body: SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 20.0, bottom: 10),
child: Column(
children: <Widget>[
SizedBox(
height: 310,
child: Scrollbar(
thumbVisibility: true,
controller: controller,
child: ListView(
controller: controller,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 15),
child: HuaweiIdAuthButton(
onPressed: _signIn,
elevation: 0,
borderRadius: AuthButtonRadius.SMALL,
buttonColor: AuthButtonBackground.RED,
),
),
_buildAuthButton(
'静默登录',
_silentSignIn,
),
_buildAuthButton(
'登出',
_signOut,
),
_buildAuthButton(
'取消授权',
_revokeAuthorization,
),
_buildAuthButton(
"构建网络Cookie",
_buildNetworkCookie,
),
_buildAuthButton(
"启用日志",
_enableLogger,
),
_buildAuthButton(
"禁用日志",
_disableLogger,
),
_buildAuthButton(
"获取授权结果",
_getAuthResult,
),
_buildAuthButton(
"独立登录",
_independentSignIn,
),
_buildAuthButton(
"请求访问令牌",
_requestAccessToken,
),
_buildAuthButton(
"获取扩展授权结果",
_getExtendedAuthResult,
),
_buildAuthButton(
"删除授权信息",
_deleteAuthInfo,
),
_buildAuthButton(
"构建网络URL",
_buildNetworkUrl,
),
_buildAuthButton(
"添加带有扩展结果的授权",
_addAuthWithExtendedResult,
),
_buildAuthButton(
"请求联合ID",
_requestUnionId,
),
_buildAuthButton(
"包含扩展参数的作用域",
containScopesWithExtendedParams,
),
],
),
),
),
],
),
),
const Divider(
indent: 15,
endIndent: 15,
color: Colors.blueGrey,
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 10.0),
child: Text('---- 双击清除日志 ----'),
),
Expanded(
child: GestureDetector(
onDoubleTap: () {
setState(() {
_logs.clear();
});
},
child: ListView.builder(
itemCount: _logs.length,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 15, vertical: 5),
child: SelectableText(
'> ${_logs[index]}',
style: const TextStyle(color: Colors.black54),
),
);
},
),
),
),
],
),
),
);
}
Future<void> containScopesWithExtendedParams() async {
AuthAccount acc = AuthAccount();
try {
bool contain = await AccountAuthManager.containScopesWithExtendedParams(
null, Impl());
_addToLogs("包含扩展参数的作用域: $contain");
} catch (e) {
_addToLogs("包含扩展参数的作用域: ${e.toString()}");
}
}
Future<void> _requestUnionId() async {
// 替换为您的账户对象
Account account = Account();
try {
String unionId = await HuaweiIdAuthTool.requestUnionId(account);
_addToLogs("请求联合ID: $unionId");
} catch (e) {
_addToLogs("请求联合ID: ${e.toString()}");
}
}
// 此函数无返回类型,查看HMS日志
void _addAuthWithExtendedResult() {
AccountAuthManager.addAuthScopesWithExtendedParams(200, Impl());
}
Future<void> _buildNetworkUrl() async {
try {
String url = await NetworkTool.buildNetworkUrl("<domain>", true);
_addToLogs("构建网络URL: $url");
} catch (e) {
_addToLogs(e.toString());
}
}
Future<void> _deleteAuthInfo() async {
// 输入您的访问令牌
bool isDeleted =
await HuaweiIdAuthTool.deleteAuthInfo("<YOUR_ACCESS_TOKEN>");
_addToLogs("删除授权信息: $isDeleted");
}
Future<void> _requestAccessToken() async {
try {
Account acc =
Account(name: "alperenkildir98@gmail.com", type: "com.huawei.hwid");
String str = await HuaweiIdAuthTool.requestAccessToken(acc, [
Scope.email,
Scope.profile,
Scope.accountMobileNumber,
Scope.openId,
Scope.game
]);
log("令牌: $str");
_addToLogs("请求访问令牌: $str");
} catch (e) {
_addToLogs("请求访问令牌: ${e.toString()}");
}
}
Future<void> _getExtendedAuthResult() async {
AuthAccount account =
await AccountAuthManager.getExtendedAuthResult(Impl());
_addToLogs("扩展授权结果: ${account.toMap()}");
log("账户: ${account.toMap()}");
}
Future<void> _independentSignIn() async {
var acc = await AccountAuthService({}).independentSignIn("<access_token>");
_addToLogs("从独立登录: ${acc.toMap()}");
}
Future<void> _getAuthResult() async {
var acc = await AccountAuthManager.getAuthResult();
_addToLogs("授权结果: ${acc.toMap()}");
}
void _enableLogger() {
AccountAuthManager.enableLogger();
_addToLogs("HMS日志已启用");
}
void _disableLogger() {
AccountAuthManager.disableLogger();
_addToLogs("HMS日志已禁用");
}
Future<void> _buildNetworkCookie() async {
var cookie = await NetworkTool.buildNetworkCookie(
"name", "value", "value", "value", true, true, 40.0);
_addToLogs("构建网络Cookie: $cookie");
}
Future<void> _signIn() async {
try {
final AuthAccount account = await _authService.signIn();
_addToLogs('从登录: ${account.toMap()}');
log("${account.toMap()}");
} on Exception catch (e) {
_addToLogs(e.toString());
}
}
Future<void> _signOut() async {
try {
final bool res = await _authService.signOut();
_addToLogs('从登出: $res');
} on Exception catch (e) {
_addToLogs(e.toString());
}
}
Future<void> _silentSignIn() async {
try {
final AuthAccount account = await _authService.silentSignIn();
_addToLogs('从静默登录: ${account.displayName}');
} on Exception catch (e) {
_addToLogs(e.toString());
}
}
Future<void> _revokeAuthorization() async {
try {
final bool res = await _authService.cancelAuthorization();
_addToLogs('从取消授权: $res');
} on Exception catch (e) {
_addToLogs(e.toString());
}
}
void _addToLogs(String s) {
setState(() {
_logs.add(s);
});
}
}
class Impl extends AccountAuthExtendedParams {
[@override](/user/override)
int getExtendedParamType() {
return super.games;
}
[@override](/user/override)
List<Scope> getExtendedScopes() {
return [Scope.email];
}
}
更多关于Flutter华为账号集成插件huawei_account的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter华为账号集成插件huawei_account的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中集成并使用huawei_account
插件以支持华为账号登录的代码案例。这个插件允许你使用华为账号进行用户认证。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加huawei_account
依赖:
dependencies:
flutter:
sdk: flutter
huawei_account: ^最新版本号 # 请替换为最新版本号
然后运行flutter pub get
来获取依赖。
2. 配置Android项目
2.1. 在android/app/build.gradle
文件中添加签名配置(如果使用Release版本)
android {
...
signingConfigs {
release {
// 添加你的签名配置信息
storeFile file('path/to/your/keystore.jks')
storePassword 'your_store_password'
keyAlias 'your_key_alias'
keyPassword 'your_key_password'
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
2.2. 配置agconnect-services.json
从华为开发者控制台下载agconnect-services.json
文件,并将其放置在android/app/
目录下。
3. 配置iOS项目(如果需要)
对于iOS项目,你需要从华为开发者控制台下载AppGalleryConnect-Services.plist
文件,并将其放置在ios/Runner/
目录下。同时,你需要在Xcode中配置App ID和相关的权限。
4. 初始化华为账号服务
在你的Flutter应用的main.dart
文件中,添加以下代码来初始化华为账号服务并进行登录操作:
import 'package:flutter/material.dart';
import 'package:huawei_account/huawei_account.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String accountId = '';
String displayName = '';
@override
void initState() {
super.initState();
_initHuaweiAccount();
}
Future<void> _initHuaweiAccount() async {
try {
// 初始化华为账号服务
await HuaweiAccount.init();
// 请求华为账号授权
var authResult = await HuaweiAccount.silentSignIn();
if (authResult != null && authResult.isSuccessful) {
var profile = authResult.profile;
setState(() {
accountId = profile.accountId;
displayName = profile.displayName;
});
} else {
// 如果silentSignIn失败,可以尝试显示登录界面
var signInResult = await HuaweiAccount.signIn();
if (signInResult != null && signInResult.isSuccessful) {
var profile = signInResult.profile;
setState(() {
accountId = profile.accountId;
displayName = profile.displayName;
});
} else {
print('登录失败: ${signInResult?.errorCode}');
}
}
} catch (e) {
print('初始化华为账号服务失败: $e');
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('华为账号集成示例'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Account ID: $accountId'),
SizedBox(height: 20),
Text('Display Name: $displayName'),
],
),
),
),
);
}
}
5. 处理权限和错误
在实际应用中,你可能需要处理更多的权限请求和错误处理逻辑。例如,检查用户是否已经授予了必要的权限,处理登录失败的情况等。
6. 测试
确保你已经在华为开发者控制台正确配置了你的应用,并且已经上传了正确的签名证书。然后,你可以通过运行你的Flutter应用来测试华为账号的集成。
这个代码案例展示了如何在Flutter应用中集成华为账号服务,并获取用户的基本信息。你可以根据需要进一步扩展功能,例如获取用户的更多详细信息或处理用户注销等。