Flutter集成HUAWEI Account Kit点击登录未弹出授权页问题求助
我参考相关官方文档进行HMS Account Kit插件集成,预期效果如下:
按预期,点击华为登录按钮后应当弹出华为ID授权页面,但实际点击后页面始终停留在登录页,同时弹出大量无法解读的日志。
日志信息如下:
相关实现代码如下:
import 'package:flutter/material.dart'; import 'package:huawei_account/huawei_account.dart'; import 'package:sign_in_hms/home.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'AccountKit', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: MyHomePage(title: 'Account Kit'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key? key, required this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { List<String> logs = []; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Stack( fit: StackFit.expand, children: <Widget>[ Image( image: AssetImage("assets/images/mobile.png"), fit: BoxFit.cover, ), Form( child: Container( padding: const EdgeInsets.all(60.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ TextField( decoration: InputDecoration( labelText: "输入邮箱", focusColor: Colors.white), keyboardType: TextInputType.emailAddress, ), TextField( decoration: InputDecoration(labelText: "输入密码"), keyboardType: TextInputType.text, ), Padding( padding: const EdgeInsets.only(top: 20.0, bottom: 20.0), ), MaterialButton( minWidth: 100.0, height: 40.0, onPressed: () => {print('object')}, color: Colors.red, textColor: Colors.white, child: Text("登录", style: TextStyle(fontSize: 20)), ), Padding( padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), ), Text( '( 或者 )', textAlign: TextAlign.center, overflow: TextOverflow.ellipsis, style: TextStyle( fontWeight: FontWeight.bold, color: Colors.white, fontSize: 15), ), Padding( padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), ), MaterialButton( child: Text( "华为账号登录", style: TextStyle(fontSize: 20), ), minWidth: 100.0, height: 40.0, onPressed: _onSinIn, color: Colors.red, textColor: Colors.white, padding: EdgeInsets.fromLTRB(10, 10, 10, 10), ) ], ), )) ], ), ); } void _onSinIn() async { AccountAuthParamsHelper authParamHelper = AccountAuthParamsHelper(); authParamHelper ..setIdToken() ..setAuthorizationCode() ..setAccessToken() ..setProfile() ..setEmail() ..setScopeList([Scope.openId]); try { final AuthAccount accountInfo = await AccountAuthService.signIn(authParamHelper); setState(() { Navigator.push( context, MaterialPageRoute( builder: (context) => Home(accountInfo)), ); _showToast(context); logs.add(accountInfo.displayName); }); } on Exception catch (exception) { print(exception.toString()); logs.add(exception.toString()); } } void _showToast(BuildContext context) { final scaffold = ScaffoldMessenger.of(context); scaffold.showSnackBar( SnackBar( content: const Text('登录成功'), action: SnackBarAction( label: '撤销', onPressed: scaffold.hideCurrentSnackBar), ), ); } }
修复方案
1. 核心代码错误修复
当前最直接的问题是AccountAuthParamsHelper配置完参数后没有调用build()方法生成正式授权参数,无法传入授权接口,同时页面跳转逻辑不需要放在setState中,修改后的_onSinIn方法如下:
void _onSinIn() async { AccountAuthParamsHelper authParamHelper = AccountAuthParamsHelper(); authParamHelper ..setIdToken() ..setAuthorizationCode() ..setAccessToken() ..setProfile() ..setEmail() ..setScopeList([Scope.openId]); // 生成正式授权参数 AccountAuthParams authParams = authParamHelper.build(); try { // 传入生成好的授权参数发起登录 final AuthAccount accountInfo = await AccountAuthService.signIn(authParams); // 直接执行页面跳转和成功提示 Navigator.push( context, MaterialPageRoute(builder: (context) => Home(accountInfo)), ); _showToast(context); // 仅更新状态变量的逻辑放在setState中即可 setState(() { logs.add(accountInfo.displayName ?? "匿名用户"); }); } on Exception catch (exception) { print(exception.toString()); setState(() { logs.add(exception.toString()); }); } }
2. 配置项排查(修改代码后仍有问题时按顺序检查)
- 确认已经在AGC后台开通Account Kit服务,且将生成的
agconnect-services.json文件放在安卓项目的app目录下 - 确认项目打包使用的签名文件指纹和AGC后台填写的指纹完全一致
- 确认测试设备上的HMS Core版本不低于4.0.0,低版本会导致授权失败
- 确认pubspec.yaml中引入的huawei_account插件版本不存在依赖冲突
内容的提问来源于stack exchange,提问作者kiku
相关产品推荐
相关产品推荐

