dart Flutter,构建NLoginForm(dirty)时抛出了以下_TypeError:类型'BLOG'不是类型'String'的子类型

iyzzxitl  于 5个月前  发布在  Flutter
关注(0)|答案(1)|浏览(63)

我在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,但它没有工作。我需要帮助;-;

dphi5xsq

dphi5xsq1#

对我来说,似乎localStorage.read('REMEMBER_ME_EMAIL');可以返回Null,而不是String
尝试添加一个默认值,类似这样:

email.text = localStorage.read('REMEMBER_ME_EMAIL') ?? '';

字符串

相关问题