我在Android上构建这个没有问题,但当我尝试在iOS上构建时,我遇到了这个错误。我能够在Android上完成所有的认证过程,没有问题,但我不能在iOS上。
完整代码和错误如下:
登录表单.dart
class NLoginForm extends StatelessWidget {
const NLoginForm({
super.key,
});
@override
Widget build(BuildContext context) {
final controller = Get.put(LoginController());
return Form(
key: controller.loginFormKey,
child: Padding(
padding: const EdgeInsets.symmetric(vertical: NSizes.spaceBtwSections),
child: Column(
children: [
// email
TextFormField(
controller: controller.email,
validator: (value) => NValidator.validateEmail(value),
decoration: const InputDecoration(
prefixIcon: Icon(Iconsax.direct_right),
labelText: NTexts.email,
),
),
const SizedBox(height: NSizes.spaceBtwInputFields),
// password
Obx(
() => TextFormField(
controller: controller.password,
validator: (value) =>
NValidator.validateEmptyText('Password', value),
obscureText: controller.hidePassword.value,
decoration: InputDecoration(
labelText: NTexts.password,
prefixIcon: const Icon(Iconsax.password_check),
suffixIcon: IconButton(
onPressed: () => controller.hidePassword.value =
!controller.hidePassword.value,
icon: Icon(controller.hidePassword.value
? Iconsax.eye_slash
: Iconsax.eye),
),
),
),
),
const SizedBox(height: NSizes.spaceBtwInputFields),
// remember me & forget password
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
// remember me
Row(
children: [
Obx(
() => Checkbox(
fillColor: MaterialStateProperty.resolveWith(
(states) {
if (states.contains(MaterialState.selected)) {
return NColors.primary;
} else {
return Colors.transparent;
}
},
),
value: controller.rememberMe.value,
onChanged: (value) => controller.rememberMe.value =
!controller.rememberMe.value,
),
),
const Text(NTexts.rememberMe),
],
),
// forgot password
TextButton(
onPressed: () => Get.to(() => const ForgotPassword()),
style: const ButtonStyle(
foregroundColor: MaterialStatePropertyAll(NColors.darkGrey),
),
child: const Text(NTexts.forgetPassword),
),
],
),
const SizedBox(height: NSizes.spaceBtwSections),
// sign in button
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: () => controller.emailAndPasswordSignIn(),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(NColors.primary),
side: MaterialStateProperty.all(
const BorderSide(color: NColors.primary),
),
),
child: const Text(NTexts.signIn),
),
),
const SizedBox(height: NSizes.spaceBtwItems),
// create account button
SizedBox(
width: double.infinity,
child: OutlinedButton(
style: ButtonStyle(
side: MaterialStateProperty.all(
const BorderSide(color: NColors.grey),
),
),
onPressed: () => Get.to(() => const SignupScreen()),
child: const Text(NTexts.createAccount),
),
),
],
),
),
);
}
}
字符串
login_controller.dart
class LoginController extends GetxController {
static LoginController get instance => Get.find();
// variables
final email = TextEditingController();
final password = TextEditingController();
final localStorage = GetStorage();
final hidePassword = true.obs;
final rememberMe = false.obs;
GlobalKey<FormState> loginFormKey = GlobalKey<FormState>();
final userController = Get.put(UserController());
@override
void onInit() {
email.text = localStorage.read('REMEMBER_ME_EMAIL');
// if dont want to save password can skip this
// password.text = localStorage.read('REMEMBER_ME_PASSWORD');
super.onInit();
}
// email & password sign in
Future<void> emailAndPasswordSignIn() async {
try {
// start loading
NFullScreenLoader.openLoadingDialog(
'Logging you in...', NImages.lightNameAppLogo);
// check internet connectivity
final isConnected = await NetworkManager.instance.isConnected();
if (!isConnected) {
// remove loader
NFullScreenLoader.stopLoading();
return;
}
// form validation
if (!loginFormKey.currentState!.validate()) {
// remove loader
NFullScreenLoader.stopLoading();
return;
}
// save data if remember me is selected
if (rememberMe.value) {
localStorage.write('REMEMBER_ME_EMAIL', email.text.trim());
localStorage.write('REMEMBER_ME_PASSWORD', password.text.trim());
}
// login user using email & password auth
// ignore: unused_local_variable
final userCredentials = await AuthenticationRepository.instance
.loginWithEmailAndPassword(email.text.trim(), password.text.trim());
// remove loader
NFullScreenLoader.stopLoading();
// Redirect
AuthenticationRepository.instance.screenRedirect();
} catch (e) {
NFullScreenLoader.stopLoading();
NLoaders.errorSnackBar(title: 'Oh Snap!', message: e.toString());
}
}
// google signin authentication
Future<void> googleSignIn() async {
try {
// start loading
NFullScreenLoader.openLoadingDialog(
'Logging you in...', NImages.lightNameAppLogo);
// check internet connectivity
final isConnected = await NetworkManager.instance.isConnected();
if (!isConnected) {
NFullScreenLoader.stopLoading();
return;
}
// google auth
final userCredentials =
await AuthenticationRepository.instance.signInWithGoogle();
// save user record
await userController.saveUserRecord(userCredentials);
// remove loader
NFullScreenLoader.stopLoading();
// redirect
AuthenticationRepository.instance.screenRedirect();
} catch (e) {
NLoaders.errorSnackBar(title: 'Oh Snap!', message: e.toString());
}
}
}
型
错误信息
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY
╞═══════════════════════════════════════════════════════════
The following _TypeError was thrown building NLoginForm(dirty):
type 'Null' is not a subtype of type 'String'
The relevant error-causing widget was:
NLoginForm
NLoginForm:file:///Users/immranjohari/Documents/safwan/nutriscan_beta/nutriscan_beta
/lib/features/authentication/screens/login/login.dart:28:21
When the exception was thrown, this was the stack:
#0 LoginController.onInit
(package:nutriscan_beta/features/authentication/controllers/login/login_controller.dar
t:25:11)
#1 GetLifeCycleBase._onStart (package:get/get_instance/src/lifecycle.dart:66:5)
#2 InternalFinalCallback.call (package:get/get_instance/src/lifecycle.dart:12:26)
#3 GetInstance._startController
(package:get/get_instance/src/get_instance.dart:254:16)
#4 GetInstance._initDependencies
(package:get/get_instance/src/get_instance.dart:205:11)
#5 GetInstance.find (package:get/get_instance/src/get_instance.dart:302:17)
#6 GetInstance.put (package:get/get_instance/src/get_instance.dart:87:12)
#7 Inst.put (package:get/get_instance/src/extension_instance.dart:89:21)
#8 NLoginForm.build
(package:nutriscan_beta/features/authentication/screens/login/widgets/login_form.dart:
19:28)#9 StatelessElement.build (package:flutter/src/widgets/framework.dart:5541:49)
#10 ComponentElement.performRebuild
(package:flutter/src/widgets/framework.dart:5471:15)
#11 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7)
#12 ComponentElement._firstBuild
(package:flutter/src/widgets/framework.dart:5453:5)
#13 ComponentElement.mount (package:flutter/src/widgets/framework.dart:5447:5)
#14 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4326:16)
#15 MultiChildRenderObjectElement.inflateWidget
(package:flutter/src/widgets/framework.dart:6871:36)
#16 MultiChildRenderObjectElement.mount
(package:flutter/src/widgets/framework.dart:6883:32)
... Normal element mounting (89 frames)
#105 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4326:16)
#106 MultiChildRenderObjectElement.inflateWidget
(package:flutter/src/widgets/framework.dart:6871:36)
#107 MultiChildRenderObjectElement.mount
(package:flutter/src/widgets/framework.dart:6883:32)
... Normal element mounting (134 frames)
#241 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4326:16)
#242 MultiChildRenderObjectElement.inflateWidget
(package:flutter/src/widgets/framework.dart:6871:36)
#243 MultiChildRenderObjectElement.mount
(package:flutter/src/widgets/framework.dart:6883:32)
... Normal element mounting (9 frames)
#252 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4326:16)
#253 MultiChildRenderObjectElement.inflateWidget
(package:flutter/src/widgets/framework.dart:6871:36)
#254 MultiChildRenderObjectElement.mount
(package:flutter/src/widgets/framework.dart:6883:32)
... Normal element mounting (178 frames)
#432 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4326:16)
#433 MultiChildRenderObjectElement.inflateWidget
(package:flutter/src/widgets/framework.dart:6871:36)
#434 Element.updateChild (package:flutter/src/widgets/framework.dart:3837:18)
#435 Element.updateChildren (package:flutter/src/widgets/framework.dart:4024:32)
#436 MultiChildRenderObjectElement.update
(package:flutter/src/widgets/framework.dart:6896:17)
#437 Element.updateChild (package:flutter/src/widgets/framework.dart:3815:15)
#438 ComponentElement.performRebuild
(package:flutter/src/widgets/framework.dart:5496:16)
#439 StatefulElement.performRebuild
(package:flutter/src/widgets/framework.dart:5634:11)
#440 Element.rebuild (package:flutter/src/widgets/framework.dart:5187:7)
#441 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2895:19)
#442 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:984:21)
#443 RendererBinding._handlePersistentFrameCallback
(package:flutter/src/rendering/binding.dart:457:5)
#444 SchedulerBinding._invokeFrameCallback
(package:flutter/src/scheduler/binding.dart:1325:15)
#445 SchedulerBinding.handleDrawFrame
(package:flutter/src/scheduler/binding.dart:1255:9)
#446 SchedulerBinding._handleDrawFrame
(package:flutter/src/scheduler/binding.dart:1113:5)
#447 _invoke (dart:ui/hooks.dart:312:13)
#448 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:383:5)
#449 _drawFrame (dart:ui/hooks.dart:283:31)
型
我也尝试重新连接到Firebase,但它没有工作。我需要帮助;-;
1条答案
按热度按时间dphi5xsq1#
对我来说,似乎
localStorage.read('REMEMBER_ME_EMAIL');
可以返回Null
,而不是String
。尝试添加一个默认值,类似这样:
字符串