【问题标题】:Flutter getx ui not fully build issue on loading --release versionFlutter getx ui 加载时未完全构建问题 --release 版本
【发布时间】:2023-02-18 09:04:04
【问题描述】:

大家,我对 flutter 应用程序的发布版本有疑问,当应用程序在安装后第一次加载时,我确实得到了完美的一切,但在退出并重新打开应用程序后,Ui 构建出现了问题。 This is the expected result and as I get it for the first time.

This is what I get from the second time.

我注意到的关键点:

  • 我认为它与 getX 和 get 控制器有关,因为在使用 get 之前我没有遇到任何错误,而我必须使用 getx 构建的最新应用程序抛出类似的错误。
  • 当我在一段时间后重新打开应用程序时,它可以运行,然后在退出后再次运行,但它不会,这是一个连续的过程。
  • 我正在使用 get 并分离视图、控制器和绑定。

这是我的 main.dart 文件、login_binding.dart 文件、login_controller.dart 文件和 login_view.dart 文件。

import 'package:flutter/material.dart';

import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:sizer/sizer.dart';

import 'package:travel_mate/app/utils/my_translations.dart';

import 'package:travel_mate/app/utils/themes.dart';

import 'app/modules/Bindings/login_binding.dart';
import 'app/routes/app_pages.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await GetStorage().initStorage;

  runApp(
    Sizer(
      builder: (BuildContext context, Orientation orientation,
          DeviceType deviceType) {
        var isDark = GetStorage().read('isDark');
        return GetMaterialApp(
          defaultTransition: Transition.cupertino,
          translations: MyTranslations(),
          locale: Locale('en'),
          fallbackLocale: Locale('np'),
          themeMode: isDark != null
              ? isDark
                  ? ThemeMode.dark
                  : ThemeMode.light
              : ThemeMode.system,
          debugShowCheckedModeBanner: false,
          title: "Application",
          getPages: AppPages.routes,
          initialRoute: GetStorage().read('token') != null
              ? AppPages.INITIAL
              : AppPages.SECONDARY,
          theme: lightTheme,
          darkTheme: darkTheme,
          initialBinding: LoginBinding(),
        );
      },
    ),
  );
}


import 'package:get/get.dart';
import 'package:travel_mate/app/modules/Controller/auth_controller.dart';
import 'package:travel_mate/app/modules/Controller/login_controller.dart';

class LoginBinding extends Bindings {
  @override
  void dependencies() {
    Get.put(LoginController());
    Get.put(AuthController());
  }
}

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:travel_mate/app/models/user.dart';
import 'package:travel_mate/app/modules/Controller/auth_controller.dart';
import 'package:travel_mate/app/modules/views/tab/tab_view.dart';

class LoginController extends GetxController {
  GlobalKey<FormState> formKey = GlobalKey();
  TextEditingController emailOrUsernameController = TextEditingController();
  TextEditingController passwordController = TextEditingController();
  var isLoading = false.obs;
  Rx<User?>? user;

  @override
  void dispose() {
    super.dispose();
    emailOrUsernameController.dispose();
    passwordController.dispose();
  }

  final count = 0.obs;

  void increment() => count.value++;

  void login() async {
    if (formKey.currentState!.validate()) {
      isLoading.value = true;

      Rx<User?> response = (await AuthController.instance
              .login(emailOrUsernameController.text, passwordController.text))
          .obs;
      if (response.value != null) {
        GetStorage().write('token', response.value!.token);

        Get.offAndToNamed('/tab');
      }
      isLoading.value = false;
    }
  }

  void clearFields() {
    emailOrUsernameController.clear();
    passwordController.clear();
  }

  String? validateEmailOrUsername(String? value) {
    {
      if (value!.isEmpty) {
        return "Email or username can't be empty!";
      } else if (!GetUtils.isEmail(value)) {
        return "Not a valid email address!";
      }
      return null;
    }
  }

  String? validatePassword(String? value) {
    {
      if (value!.isEmpty) {
        return "Password can't be empty!";
      } else if (value.length < 8) {
        return "Password can't be less than 8 characters!";
      }
      return null;
    }
  }
}

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';

import 'package:get/get.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:sizer/sizer.dart';
import 'package:travel_mate/app/global_components/my_text_field.dart';
import 'package:travel_mate/app/modules/views/components/custom_button.dart';
import 'package:travel_mate/app/utils/colors.dart';

import '../Controller/login_controller.dart';

class LoginView extends GetView<LoginController> {
  const LoginView({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: SingleChildScrollView(
          keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
          child: Column(
            children: [
              Container(
                margin: EdgeInsets.symmetric(horizontal: 5.w, vertical: 5.w),

                //FORMS START FROM HERE

                child: Form(
                  key: controller.formKey,
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      //Main art and logo

                      Center(
                        child: SvgPicture.asset(
                          'assets/images/login_art.svg',
                          width: 75.w,
                        ),
                      ),
                      SizedBox(
                        height: 1.h,
                      ),
                      Center(
                        child: Text(
                          'TravelMate',
                          style: TextStyle(
                            fontFamily: 'Comic Sans Ms',
                            fontSize: 22.5.sp,
                            color: primaryColor,
                          ),
                        ),
                      ),
                      SizedBox(
                        height: 2.h,
                      ),
                      Text(
                        'login'.tr,
                        style: TextStyle(
                          fontFamily:
                              GoogleFonts.poppins(fontWeight: FontWeight.bold)
                                  .fontFamily,
                          fontSize: 15.sp,
                          color: primaryColor,
                        ),
                      ),
                      SizedBox(
                        height: 2.h,
                      ),

                      //Username Field

                      MyTextField(
                        textEditingController:
                            controller.emailOrUsernameController,
                        validator: controller.validateEmailOrUsername,
                        textInputAction: TextInputAction.next,
                        labelText: 'emailLabel'.tr,
                      ),
                      SizedBox(
                        height: 3.h,
                      ),

                      //Password Field

                      MyTextField(
                        validator: controller.validatePassword,
                        textEditingController: controller.passwordController,
                        textInputAction: TextInputAction.done,
                        labelText: 'passwordLabel'.tr,
                        isPassword: true,
                      ),
                      SizedBox(
                        height: 3.h,
                      ),
                      Row(
                        mainAxisAlignment: MainAxisAlignment.end,
                        children: [
                          InkWell(
                            onTap: () {},
                            child: Text(
                              'forgot'.tr,
                              style: TextStyle(
                                  fontFamily: GoogleFonts.poppins().fontFamily),
                            ),
                          )
                        ],
                      ),
                      SizedBox(
                        height: 4.h,
                      ),

                      //Login button

                      Obx(
                        () => CustomButton(
                            onTap: controller.login,
                            isLoading: controller.isLoading.value,
                            title: 'login'.tr),
                      ),
                      SizedBox(
                        height: 4.h,
                      ),

                      //Sign in with google button

                      SizedBox(
                        height: 4.h,
                      ),

                      //Not registered yet button

                      Center(
                        child: Text.rich(
                          TextSpan(
                            style: TextStyle(
                              fontFamily: GoogleFonts.poppins().fontFamily,
                              fontSize: 12.sp,
                              // color: const Color(0xff000000),
                            ),
                            children: [
                              TextSpan(
                                text: 'registerText'.tr,
                              ),
                              TextSpan(
                                recognizer: TapGestureRecognizer()
                                  ..onTap = (() {
                                    Get.toNamed('/sign-up');
                                  }),
                                text: 'signup'.tr,
                                style: TextStyle(
                                  color: const Color(0xff0189e2),
                                ),
                              ),
                            ],
                          ),
                          textHeightBehavior: TextHeightBehavior(
                              applyHeightToFirstAscent: false),
                          textAlign: TextAlign.center,
                          softWrap: false,
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: android flutter get flutter-getx


    【解决方案1】:

    更新:在尝试了一些可能的原因并将运行应用程序函数的调用延迟了大约 500 毫秒之后,我能够解决这个问题,但仍然不确定是什么导致了这样的错误。

    【讨论】:

      【解决方案2】:

      太神奇了......我试了整整一个月,什么都试过了,克服了这个问题,但是这一步解决了。

      【讨论】:

        猜你喜欢
        • 2020-12-18
        • 2020-02-18
        • 1970-01-01
        • 2021-10-03
        • 1970-01-01
        • 1970-01-01
        • 2021-07-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多