You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Google登录实现中SignInController类型不匹配错误

Flutter Google登录:SignInController类型不匹配错误

错误详情

抛出的类型错误:

The following _TypeError was thrown while handling a gesture:
type 'SignInController' is not a subtype of type 'SignInController' in type cast where
  SignInController is from package:udemy_chat_app/pages/sign_in//controller.dart
  SignInController is from package:udemy_chat_app/pages/sign_in/controller.dart

堆栈跟踪:

#0      GetInstance._startController (package:get/get_instance/src/get_instance.dart:251:44)
#1      GetInstance._initDependencies (package:get/get_instance/src/get_instance.dart:204:11)
#2      GetInstance.find (package:get/get_instance/src/get_instance.dart:301:17)
#3      GetView.controller (package:get/get_state_manager/src/simple/get_view.dart:38:37)
#4      SignInPage.build.buildThirdPartyLogin.<anonymous closure> (package:udemy_chat_app/pages/sign_in/view.dart:88:33)
#5      _InkResponseState.handleTap (package:flutter/src/material/ink_well.dart:1154:21)
#6      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:275:24)
#7      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:654:11)
#8      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:311:5)
#9      BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:244:7)
#10     PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:630:9)
#11     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:98:12)
#12     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:143:9)
#13     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:625:13)
#14     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:141:18)
#15     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:127:7)
#16     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:465:19)
#17     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:445:22)
#18     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:331:11)
#19     GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:400:7)
#20     GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:363:5)
#21     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:320:7)
#22     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:293:9)
#23     _invoke1 (dart:ui/hooks.dart:158:13)
#24     PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:382:7)
#25     _dispatchPointerDataPacket (dart:ui/hooks.dart:91:31)

相关代码

SignInController代码

import 'package:get/get.dart';
import 'package:udemy_chat_app/common/entities/entities.dart';
import 'package:udemy_chat_app/common/routes/names.dart';
import 'package:udemy_chat_app/common/store/store.dart';
import 'index.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

GoogleSignIn _googleSignIn = GoogleSignIn(
  scopes:<String>[
    'openid'
  ]
);

class SignInController extends GetxController{
  final state = SignInState();
  SignInController();
   final db = FirebaseFirestore.instance;
   Future<void> handleSignIn() async {
     try{
       var user = await _googleSignIn.signIn();
       if (user!=null){
         String displayName = user.displayName??user.email;
         String email = user.email;
         String id = user.id;
         String photoUrl = user.photoUrl??"";
         UserLoginResponseEntity userProfile = UserLoginResponseEntity();
         userProfile.email=email;
         userProfile.accessToken = id;
         userProfile.displayName = displayName;
         userProfile.photoUrl = photoUrl;

         UserStore.to.saveProfile(userProfile);
       }
     }catch(e){

     }
   }
}

SignInPage视图代码

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:udemy_chat_app/common/values/colors.dart';
import 'package:udemy_chat_app/common/widgets/button.dart';
import 'package:udemy_chat_app/pages/sign_in/controller.dart';


class SignInPage extends GetView<SignInController> {
  const SignInPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {

    Widget buildLogo(){
      return Container(
        width: 110.w,
        margin: EdgeInsets.only(top: 84.h),
        child: Column(
          children: [
            Container(
              width: 76.w,
              height: 76.w,
              margin: EdgeInsets.symmetric(horizontal: 15.w),
              child: Stack(
                children: [
                  Positioned(
                      child: Container(
                        height: 76.w,
                        decoration: const BoxDecoration(
                          color: null,
                          borderRadius: BorderRadius.all(Radius.circular(35))
                        ),
                      )
                  ),
                  Positioned(child: Image.asset(
                    'assets/images/ic_launcher.png',
                    width: 76.w,
                    height: 76.w,
                    fit: BoxFit.cover,
                  ),
                  )
                ],
              ),
            ),
            Container(
              margin: EdgeInsets.only(
                top: 15.h , bottom: 15.h
              ),
              child:
              const Text(
                "Let's begin",
                textAlign: TextAlign.center,
                style: TextStyle(
                  color: AppColors.thirdElement,
                  fontWeight: FontWeight.w600,
                  fontSize: 18,
                  height: 1
                ),
              ),
            )
          ],
        ),
      );
    }
    Widget buildThirdPartyLogin(){
      return Container(
        width: 295.w,
        margin: EdgeInsets.only(bottom: 280.h,),
        child: Column(
          children: [
            Text(
              'Sign in with your Social media accounts',
              textAlign: TextAlign.center,
              style: TextStyle(
                  color: AppColors.primaryText,
                  fontWeight: FontWeight.w400,
                  fontSize: 16,
              ),
            ),
            Padding(padding: EdgeInsets.only(
              top: 30, left: 50, right: 50
            ),
              child: btnFlatButtonWidget(
                  onPressed: (){controller.handleSignIn();},
                width: 200.w,
                height: 55.h,
                title: "Sign In with Google"
              ),
            )
          ],
        ),
      );
    }

    return  Scaffold(
      body: Center(
        child: Column(
          children: [
            buildLogo(),
            Spacer(),
            buildThirdPartyLogin()
          ],
        ),
      )
    );
  }
}

已尝试的解决方案

  • 检查导入语句,确认导入正确的SignInController类
  • 执行flutter clean清理项目并重新构建
  • 验证Firebase配置正确,所有依赖已安装
  • 确认已添加Firebase配置文件(Android的google-services.json或iOS的GoogleService-Info.plist)

问题分析与解决建议

从错误信息可以看到,两个SignInController分别来自路径package:udemy_chat_app/pages/sign_in//controller.dart和package:udemy_chat_app/pages/sign_in/controller.dart——前者有重复的斜杠,这是核心问题:Dart会把路径中重复的斜杠视为不同的导入源,导致同一个类被加载两次,出现类型不匹配。

解决步骤:

  1. 检查所有导入语句:确保项目中所有导入SignInController的地方,路径都是package:udemy_chat_app/pages/sign_in/controller.dart,没有多余的斜杠。
  2. 检查GetX的注册逻辑:如果有手动注册Controller的代码(比如在GetMaterialApp或其他地方),确认注册的是正确路径下的Controller,没有重复注册。
  3. 清理缓存并重启:执行flutter clean后,删除.dart_tool文件夹,然后重启IDE,再重新构建项目。
  4. 检查文件结构:确认sign_in目录下只有一个controller.dart文件,没有同名文件在子目录或重复路径下。

如果以上步骤无效,尝试:

  • 在SignInPage中手动获取Controller,替换GetView的自动注入:
    // 替换GetView<SignInController>为StatelessWidget
    class SignInPage extends StatelessWidget {
      const SignInPage({Key? key}) : super(key: key);
      final SignInController controller = Get.find<SignInController>(); // 手动获取
      // ... 其余代码不变
    }
    

内容的提问来源于stack exchange,提问作者Mohamed Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:14:59