类型“Null”不是类型“Widget”的子类型

M N*_*man 7 android dart google-signin flutter

我正在编写一个关于 flutter 的代码,以便在 android/ios 和 web 上使用 Google 登录,但我第一时间就遇到了这个错误。我在 Android 模拟器上运行它来检查它是否正常工作,我现在还没有将其设置为网络。在模拟器上运行后,我收到\n以下错误:

\n
======== Exception caught by widgets library =======================================================\nThe following _TypeError was thrown building Obx(has builder, dirty, state: _ObxState#c1649):\ntype 'Null' is not a subtype of type 'Widget'\n\nThe relevant error-causing widget was: \n  Obx Obx:file:///D:/Noum/Data/Uni%20Data/Codes/Android%20Studio/Flutter/web_ios_android_google_signin/lib/LoginPage.dart:13:15\nWhen the exception was thrown, this was the stack: \n#0      LoginPage.build.<anonymous closure> (package:web_ios_android_google_signin/LoginPage.dart:16:19)\n#1      Obx.build (package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart:70:28)\n#2      RxInterface.notifyChildren (package:get/get_rx/src/rx_types/rx_core/rx_interface.dart:26:27)\n#3      _ObxState.build (package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart:54:19)\n#4      StatefulElement.build (package:flutter/src/widgets/framework.dart:4782:27)\n#5      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4665:15)\n#6      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4840:11)\n#7      Element.rebuild (package:flutter/src/widgets/framework.dart:4355:5)\n#8      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4643:5)\n#9      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4831:11)\n#184    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1143:15)\n#185    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1080:9)\n#186    SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:863:7)\n(elided 4 frames from class _RawReceivePortImpl, class _Timer, and dart:async-patch)\n====================================================================================================\n
Run Code Online (Sandbox Code Playgroud)\n

颤振医生

\n
D:\\Noum\\Data\\Uni Data\\Codes\\Android Studio\\Flutter\\web_ios_android_google_signin\\android>flutter doctor\nDoctor summary (to see all details, run flutter doctor -v):\n[\xe2\x88\x9a] Flutter (Channel beta, 2.4.0-4.2.pre, on Microsoft Windows [Version 10.0.19043.1149], locale en-PK)\n[\xe2\x88\x9a] Android toolchain - develop for Android devices (Android SDK version 30.0.3)\n[\xe2\x88\x9a] Chrome - develop for the web\n[\xe2\x88\x9a] Android Studio (version 4.2.0)\n[\xe2\x88\x9a] Connected device (3 available)\n\n\xe2\x80\xa2 No issues found!\n
Run Code Online (Sandbox Code Playgroud)\n

所有 dart 文件

\n

主dart

\n
import 'package:flutter/material.dart';\nimport 'package:get/get_navigation/src/root/get_material_app.dart';\nimport 'package:web_ios_android_google_signin/LoginPage.dart';\n\nvoid main() {\n  runApp(const MyApp());\n}\n\nclass MyApp extends StatelessWidget {\n  const MyApp({Key? key}) : super(key: key);\n\n  // This widget is the root of your application.\n  @override\n  Widget build(BuildContext context) {\n    return GetMaterialApp(\n      title: 'Flutter Demo',\n      theme: ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: LoginPage(),\n    );\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

登录控制器.dart

\n
import 'package:get/get_rx/src/rx_types/rx_types.dart';\nimport 'package:get/get_state_manager/src/simple/get_controllers.dart';\nimport 'package:google_sign_in/google_sign_in.dart';\n\nclass LoginController extends GetxController{\n var _googleSignin=GoogleSignIn();\n var googleAccount=Rx<GoogleSignInAccount?>(null);\n\nlogin() async{\n  googleAccount = (await _googleSignin.signIn()) as Rx<GoogleSignInAccount?>;\n}\n\n logOut() async{\n   googleAccount = (await _googleSignin.signOut()) as Rx<GoogleSignInAccount?>;\n }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

登录页面

\n
import 'package:flutter/material.dart';\nimport 'package:get/get.dart';\nimport 'package:web_ios_android_google_signin/Login_Controller.dart';\n\nclass LoginPage extends StatelessWidget {\n  //const LoginPage({Key? key}) : super(key: key);\nfinal controller=Get.put(LoginController());\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(title: Text('Login Page')),\n      body: Center(\n       child: Obx((){\n         if(controller.googleAccount.value==null)\n\n           return buildLoginButton();\n\n         else\n\n           return buildProfileView();\n\n       }\n       ),\n       )\n        );\n  }\n\n  buildProfileView(){\n    Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n        CircleAvatar(\n        backgroundImage: Image.network(controller.googleAccount.value?.photoUrl ?? '').image,\n    radius: 100,\n    ),\n    Text(\n        controller.googleAccount.value?.displayName ?? '',\n      style: Get.textTheme.headline3,\n    ),\n    Text(\n        controller.googleAccount.value?.email ?? '',\n      style: Get.textTheme.bodyText1,\n    ),\n          SizedBox(height: 16),\n          ActionChip(\n            avatar: Icon(Icons.logout),\n              label: Text('Logout'),\n              onPressed: (){\n              controller.logOut();\n              },\n          )\n    ],\n    );\n  }\n\n\n\n\n  buildLoginButton(){\n    FloatingActionButton.extended(\n      onPressed: (){\n        controller.login();\n      },\n      icon: Image.asset(\n        'images/googlepnglogo',\n        height: 32,\n        width: 32,\n      ),\n      label: Text('SignIn With Google'),\n      backgroundColor: Colors.white,\n      foregroundColor: Colors.black54,\n    );\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

小智 4

您忘记在以下方法中添加 return

buildProfileView(){
   return Column();
}
buildLoginButton(){
   return FloatingActionButton.extended()
}
Run Code Online (Sandbox Code Playgroud)