You need to enable JavaScript to run this app. Flutter集成HUAWEI Account Kit点击登录未弹出授权页问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 08:42:00