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会把路径中重复的斜杠视为不同的导入源,导致同一个类被加载两次,出现类型不匹配。
解决步骤:
- 检查所有导入语句:确保项目中所有导入
SignInController的地方,路径都是package:udemy_chat_app/pages/sign_in/controller.dart,没有多余的斜杠。 - 检查GetX的注册逻辑:如果有手动注册Controller的代码(比如在GetMaterialApp或其他地方),确认注册的是正确路径下的Controller,没有重复注册。
- 清理缓存并重启:执行
flutter clean后,删除.dart_tool文件夹,然后重启IDE,再重新构建项目。 - 检查文件结构:确认
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
相关产品推荐
相关产品推荐

