Серое поле отображается в выпускной версии Apk ⇐ Android
-
Гость
Серое поле отображается в выпускной версии Apk
в моем приложении Flutter есть страница входа
на этой странице входа отлично работает отладочный apk
но когда я сделал обновленный APK, кнопка входа в систему не отображается, а вместо нее отображается большой серый прямоугольник,
и ниже приведен код
import 'package:flutter/material.dart'; импортировать «пакет:graphic_solutions/Auth/auth_widget.dart»; импортировать «пакет:graphic_solutions/config/pallet.dart»; импортировать «пакет: flutter_vector_icons/flutter_vector_icons.dart»; импортировать «пакет: firebase_auth/firebase_auth.dart»; импортировать «пакет:graphic_solutions/widgets/snackbar.dart»; класс LoginScreen расширяет StatefulWidget { const LoginScreen({super.key}); @переопределить State createState() => _LoginScreenState(); } класс _LoginScreenState расширяет State { Bool isSignupScreen = ложь; поздняя строка электронной почты; поздний строковый пароль; bool обработка = ложь; окончательный GlobalKey _formKey = GlobalKey(); окончательный GlobalKey _scaffoldKey = GlobalKey(); Логический парольVisible = ложь; void logIn() асинхронный { setState(() { обработка = правда; }); если (_formKey.currentState!.validate()) { пытаться { ожидайте FirebaseAuth.instance .signInWithEmailAndPassword(электронная почта: адрес электронной почты, пароль: пароль); _formKey.currentState!.reset(); Navigator.pushReplacementNamed(context, '/main_screen'); } в FirebaseAuthException catch (e) { if (e.code == 'пользователь не найден') { setState(() { обработка = ложь; }); MyMessageHandler.showSnackBar( _scaffoldKey, 'Пользователь для этого адреса электронной почты не найден.'); } else if (e.code == 'неправильный пароль') { setState(() { обработка = ложь; }); MyMessageHandler.showSnackBar( _scaffoldKey, 'для этого пользователя указан неверный пароль.'); } } } еще { setState(() { обработка = ложь; }); MyMessageHandler.showSnackBar(_scaffoldKey, 'пожалуйста, заполните все данные'); } } @переопределить Сборка виджета (контекст BuildContext) { вернуть эшафот( BackgroundColor: Palette.backgroundColor, тело: Стек( дети: [ Позиционируется( верх: 0, правильно: 0, слева: 0, ребенок: Контейнер( высота: 300, украшение: const BoxDecoration( изображение: УкрашениеИзображение( изображение: AssetImage("images/background.jpg"), подходит: BoxFit.fill), ), ребенок: Контейнер( отступ: const EdgeInsets.only(сверху: 90, слева: 20), цвет: Цвет (0xFF3b5999).с непрозрачностью (.85), ребенок: Столбец( crossAxisAlignment: CrossAxisAlignment.start, дети: [ Богатый текст( текст: TextSpan( текст: «Добро пожаловать», стиль: TextStyle( Размер шрифта: 25, интервал между буквами: 2, цвет: Цвета.желтый[700], ), дети: [ TextSpan( текст: «Графические решения», стиль: TextStyle( Размер шрифта: 25, FontWeight: FontWeight.bold, цвет: Цвета.желтый[700], ), ) ]), ), const SizedBox( высота: 5, ), константный текст( «Войдите, чтобы продолжить», стиль: TextStyle( интервал между буквами: 1, цвет: Цвета.белый, ), ) ], ), ), ), ), Позиционируется( верх: 200, ребенок: Контейнер( отступ: EdgeInsets.all(20), ширина: MediaQuery.of(context).size.width - 40, поле: EdgeInsets.symmetric(по горизонтали: 20), украшение: BoxDecoration( цвет: Цвета.белый, borderRadius: BorderRadius.circular(15), коробкаТень: [ BoxShadow( цвет: Colors.black.withOpacity(0.3), размытиеРадиус: 15, распространениеРадиус: 5) ]), дочерний элемент: Столбец(дети: [ Ряд( mainAxisAlignment: MainAxisAlignment.spaceAround, дети: [ Детектор жестов( onTap: () { setState(() { isSignupScreen = ложь; }); }, ребенок: Столбец( дети: [ Текст( 'АВТОРИЗОВАТЬСЯ', стиль: TextStyle( Размер шрифта: 16, FontWeight: FontWeight.bold, цвет: isSignupScreen ? Палитра.textColor1 : Палитра.активныйцвет, ), ), если (!isSignupScreen) Контейнер( поле: EdgeInsets.only(сверху: 3), высота: 2, ширина: 55, цвет: Цвета.оранжевый, ) ], ), ), Детектор жестов( onTap: () { setState(() { isSignupScreen = ложь; }); }, ребенок: Столбец( дети: [ Текст( 'ЗАРЕГИСТРИРОВАТЬСЯ', стиль: TextStyle( Размер шрифта: 16, FontWeight: FontWeight.bold, цвет: isSignupScreen ? Палитра.activeColor : Палитра.textColor1, ), ), если (isSignupScreen) Контейнер( поле: EdgeInsets.only(сверху: 3), высота: 2, ширина: 55, цвет: Цвета.оранжевый, ) ], ), ), ]), Контейнер( поле: EdgeInsets.only(сверху: 20), ребенок: Столбец( дети: [ Заполнение( дополнение: const EdgeInsets.all(16.0), ребенок: Форма( ключ: _formKey, дочерний элемент: Столбец(дети: [ ТекстФормФилд( валидатор: (значение) { если (значение!.isEmpty) { вернуть «пожалуйста, введите свой адрес электронной почты»; } else if (value.isValidEmail() == false) { вернуть «неверный адрес электронной почты»; } else if (value.isValidEmail() == true) { вернуть ноль; } вернуть ноль; }, тип клавиатуры: TextInputType.emailAddress, onChanged: (значение) { электронная почта = значение; }, // контроллер: _emailController, оформление: textFormDecoration.copyWith( labelText: «Адрес электронной почты», подсказка: 'Введите свой адрес электронной почты', ), ), Заполнение( отступ: const EdgeInsets.symmetric(вертикаль: 10), дочерний элемент: TextFormField( валидатор: (значение) { если (значение!.isEmpty) { вернуть «пожалуйста, введите свой пароль»; } вернуть ноль; }, onChanged: (значение) { пароль = значение; }, obscureText: парольVisible, оформление: textFormDecoration.copyWith( suffixIcon: IconButton( onPressed: () { setState(() { парольVisible = !passwordVisible; }); }, значок: Значок( парольвидимый ? Иконки.видимость : Icons.visibility_off, цвет: Цвета.фиолетовый, )), labelText: 'Пароль', подсказка: 'Введите свой пароль', ), ), ), обработка == правда ? константный Центр( дочерний элемент: CircularProgressIndicator( цвет: Цвета.фиолетовый, )) :ПозиционированнаяКнопка( при нажатии: авторизоваться, ), ]), ), ) ], ), ), ]), ), ), ], ), ); } } класс PositionedButton расширяет StatelessWidget { окончательная функция() onPressed; const PositionedButton({ Ключ? ключ, требуется это.onPressed, }); @переопределить Сборка виджета (контекст BuildContext) { вернуть позиционированное( верх: 455, правильно: 0, слева: 0, ребенок: Центр( дочерний элемент: GestureDetector( onTap: onPressed, ребенок: Контейнер( высота: 90, ширина: 90, дополнение: const EdgeInsets.all(15), украшение: BoxDecoration( цвет: Colors.white, borderRadius: BorderRadius.circular(50)), ребенок: Контейнер( украшение: BoxDecoration( градиент: LinearGradient( цвета: [ Цвета.оранжевый[200]!, Цвета.красный[400]!, ], начало: Alignment.topLeft, конец: Alignment.bottomRight, ), borderRadius: BorderRadius.circular(30), коробкаТень: [ BoxShadow( цвет: Colors.black.withOpacity(.3), распространениеРадиус: 1, размытиеРадиус: 2, смещение: Смещение(0, 1), ) ]), дочерний элемент: const Icon( Icons.arrow_forward, цвет: Цвета.белый, ), ), ), ), )); } } Я не понимаю, почему возникает эта проблема
здесь вы можете видеть, что PositionedButton — это кнопка входа в систему,
эта кнопка не отображается, а внизу появляется большой серый прямоугольник
в моем приложении Flutter есть страница входа
на этой странице входа отлично работает отладочный apk
но когда я сделал обновленный APK, кнопка входа в систему не отображается, а вместо нее отображается большой серый прямоугольник,
и ниже приведен код
import 'package:flutter/material.dart'; импортировать «пакет:graphic_solutions/Auth/auth_widget.dart»; импортировать «пакет:graphic_solutions/config/pallet.dart»; импортировать «пакет: flutter_vector_icons/flutter_vector_icons.dart»; импортировать «пакет: firebase_auth/firebase_auth.dart»; импортировать «пакет:graphic_solutions/widgets/snackbar.dart»; класс LoginScreen расширяет StatefulWidget { const LoginScreen({super.key}); @переопределить State createState() => _LoginScreenState(); } класс _LoginScreenState расширяет State { Bool isSignupScreen = ложь; поздняя строка электронной почты; поздний строковый пароль; bool обработка = ложь; окончательный GlobalKey _formKey = GlobalKey(); окончательный GlobalKey _scaffoldKey = GlobalKey(); Логический парольVisible = ложь; void logIn() асинхронный { setState(() { обработка = правда; }); если (_formKey.currentState!.validate()) { пытаться { ожидайте FirebaseAuth.instance .signInWithEmailAndPassword(электронная почта: адрес электронной почты, пароль: пароль); _formKey.currentState!.reset(); Navigator.pushReplacementNamed(context, '/main_screen'); } в FirebaseAuthException catch (e) { if (e.code == 'пользователь не найден') { setState(() { обработка = ложь; }); MyMessageHandler.showSnackBar( _scaffoldKey, 'Пользователь для этого адреса электронной почты не найден.'); } else if (e.code == 'неправильный пароль') { setState(() { обработка = ложь; }); MyMessageHandler.showSnackBar( _scaffoldKey, 'для этого пользователя указан неверный пароль.'); } } } еще { setState(() { обработка = ложь; }); MyMessageHandler.showSnackBar(_scaffoldKey, 'пожалуйста, заполните все данные'); } } @переопределить Сборка виджета (контекст BuildContext) { вернуть эшафот( BackgroundColor: Palette.backgroundColor, тело: Стек( дети: [ Позиционируется( верх: 0, правильно: 0, слева: 0, ребенок: Контейнер( высота: 300, украшение: const BoxDecoration( изображение: УкрашениеИзображение( изображение: AssetImage("images/background.jpg"), подходит: BoxFit.fill), ), ребенок: Контейнер( отступ: const EdgeInsets.only(сверху: 90, слева: 20), цвет: Цвет (0xFF3b5999).с непрозрачностью (.85), ребенок: Столбец( crossAxisAlignment: CrossAxisAlignment.start, дети: [ Богатый текст( текст: TextSpan( текст: «Добро пожаловать», стиль: TextStyle( Размер шрифта: 25, интервал между буквами: 2, цвет: Цвета.желтый[700], ), дети: [ TextSpan( текст: «Графические решения», стиль: TextStyle( Размер шрифта: 25, FontWeight: FontWeight.bold, цвет: Цвета.желтый[700], ), ) ]), ), const SizedBox( высота: 5, ), константный текст( «Войдите, чтобы продолжить», стиль: TextStyle( интервал между буквами: 1, цвет: Цвета.белый, ), ) ], ), ), ), ), Позиционируется( верх: 200, ребенок: Контейнер( отступ: EdgeInsets.all(20), ширина: MediaQuery.of(context).size.width - 40, поле: EdgeInsets.symmetric(по горизонтали: 20), украшение: BoxDecoration( цвет: Цвета.белый, borderRadius: BorderRadius.circular(15), коробкаТень: [ BoxShadow( цвет: Colors.black.withOpacity(0.3), размытиеРадиус: 15, распространениеРадиус: 5) ]), дочерний элемент: Столбец(дети: [ Ряд( mainAxisAlignment: MainAxisAlignment.spaceAround, дети: [ Детектор жестов( onTap: () { setState(() { isSignupScreen = ложь; }); }, ребенок: Столбец( дети: [ Текст( 'АВТОРИЗОВАТЬСЯ', стиль: TextStyle( Размер шрифта: 16, FontWeight: FontWeight.bold, цвет: isSignupScreen ? Палитра.textColor1 : Палитра.активныйцвет, ), ), если (!isSignupScreen) Контейнер( поле: EdgeInsets.only(сверху: 3), высота: 2, ширина: 55, цвет: Цвета.оранжевый, ) ], ), ), Детектор жестов( onTap: () { setState(() { isSignupScreen = ложь; }); }, ребенок: Столбец( дети: [ Текст( 'ЗАРЕГИСТРИРОВАТЬСЯ', стиль: TextStyle( Размер шрифта: 16, FontWeight: FontWeight.bold, цвет: isSignupScreen ? Палитра.activeColor : Палитра.textColor1, ), ), если (isSignupScreen) Контейнер( поле: EdgeInsets.only(сверху: 3), высота: 2, ширина: 55, цвет: Цвета.оранжевый, ) ], ), ), ]), Контейнер( поле: EdgeInsets.only(сверху: 20), ребенок: Столбец( дети: [ Заполнение( дополнение: const EdgeInsets.all(16.0), ребенок: Форма( ключ: _formKey, дочерний элемент: Столбец(дети: [ ТекстФормФилд( валидатор: (значение) { если (значение!.isEmpty) { вернуть «пожалуйста, введите свой адрес электронной почты»; } else if (value.isValidEmail() == false) { вернуть «неверный адрес электронной почты»; } else if (value.isValidEmail() == true) { вернуть ноль; } вернуть ноль; }, тип клавиатуры: TextInputType.emailAddress, onChanged: (значение) { электронная почта = значение; }, // контроллер: _emailController, оформление: textFormDecoration.copyWith( labelText: «Адрес электронной почты», подсказка: 'Введите свой адрес электронной почты', ), ), Заполнение( отступ: const EdgeInsets.symmetric(вертикаль: 10), дочерний элемент: TextFormField( валидатор: (значение) { если (значение!.isEmpty) { вернуть «пожалуйста, введите свой пароль»; } вернуть ноль; }, onChanged: (значение) { пароль = значение; }, obscureText: парольVisible, оформление: textFormDecoration.copyWith( suffixIcon: IconButton( onPressed: () { setState(() { парольVisible = !passwordVisible; }); }, значок: Значок( парольвидимый ? Иконки.видимость : Icons.visibility_off, цвет: Цвета.фиолетовый, )), labelText: 'Пароль', подсказка: 'Введите свой пароль', ), ), ), обработка == правда ? константный Центр( дочерний элемент: CircularProgressIndicator( цвет: Цвета.фиолетовый, )) :ПозиционированнаяКнопка( при нажатии: авторизоваться, ), ]), ), ) ], ), ), ]), ), ), ], ), ); } } класс PositionedButton расширяет StatelessWidget { окончательная функция() onPressed; const PositionedButton({ Ключ? ключ, требуется это.onPressed, }); @переопределить Сборка виджета (контекст BuildContext) { вернуть позиционированное( верх: 455, правильно: 0, слева: 0, ребенок: Центр( дочерний элемент: GestureDetector( onTap: onPressed, ребенок: Контейнер( высота: 90, ширина: 90, дополнение: const EdgeInsets.all(15), украшение: BoxDecoration( цвет: Colors.white, borderRadius: BorderRadius.circular(50)), ребенок: Контейнер( украшение: BoxDecoration( градиент: LinearGradient( цвета: [ Цвета.оранжевый[200]!, Цвета.красный[400]!, ], начало: Alignment.topLeft, конец: Alignment.bottomRight, ), borderRadius: BorderRadius.circular(30), коробкаТень: [ BoxShadow( цвет: Colors.black.withOpacity(.3), распространениеРадиус: 1, размытиеРадиус: 2, смещение: Смещение(0, 1), ) ]), дочерний элемент: const Icon( Icons.arrow_forward, цвет: Цвета.белый, ), ), ), ), )); } } Я не понимаю, почему возникает эта проблема
здесь вы можете видеть, что PositionedButton — это кнопка входа в систему,
эта кнопка не отображается, а внизу появляется большой серый прямоугольник
Мобильная версия