#flutter #dart
#сбой #dart
Вопрос:
я создавал свою страницу приветствия, и, когда она была завершена, я решил упорядочить компоненты страницы в разных файлах. Это код страницы приветствия:
class WelcomePage extends StatelessWidget {
final globalVariables = GlobalVariables();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
TxtInfo(),
Container(
width: double.infinity,
height: globalVariables.height * 0.55,
child: Stack(
children: <Widget>[
SvgPicture.asset(
kBlueBackground,
fit: BoxFit.fill,
),
Center(
child: Container(
constraints: BoxConstraints(
maxWidth: globalVariables.width * 0.76,
),
height: globalVariables.height * 0.45,
child: Buttons(),
),
),
],
),
),
],
),
);
}
}
Вот его верхняя часть страницы:
class TxtInfo extends StatelessWidget {
final globalVariables = GlobalVariables();
@override
Widget build(BuildContext context) {
return Center(
child: Container(
width: globalVariables.width * 0.76,
height: globalVariables.height * 0.45,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Txt(
txt: 'Bem-Vindo!',
txtStyle: kTitleTextStyle,
),
Txt(
txt: 'Acesse a sua conta para continuar',
txtStyle: kBlackParagraphTextStyle,
),
],
),
),
);
}
}
И вот вторая часть:
class Buttons extends StatelessWidget {
final globalVariables = GlobalVariables();
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Button(
height: globalVariables.height,
txt: 'Criar conta agora',
txtStyle: kWhiteButtonTextStyle,
buttonColor: Colors.transparent,
onPressed: globalVariables.navigateToCreateAccountPage,
),
Button(
height: globalVariables.height,
txt: 'Entrar',
txtStyle: kBlackButtonTextStyle,
buttonColor: kWhiteColor,
onPressed: globalVariables.navigateToLoginPage,
),
Txt(
txt: 'ou',
txtStyle: kWhiteParagraphTextStyle,
),
SocialButton(
height: globalVariables.height,
direct: kFacebookIcon,
txt: 'Entar com Facebook',
txtStyle: kFacebookButtonTextStyle,
buttonColor: kWhiteColor,
),
SocialButton(
height: globalVariables.height,
direct: kGoogleIcon,
txt: 'Entrar com Google',
txtStyle: kGoogleButtonTextStyle,
buttonColor: kWhiteColor,
),
],
);
}
}
Вот это код файла глобальных переменных:
class GlobalVariables extends StatelessWidget {
get navigateToLoginPage => null;
get navigateToCreateAccountPage => null;
get width => null;
get height => null;
@override
Widget build(BuildContext context) {
double width = MediaQuery.of(context).size.width;
double height = MediaQuery.of(context).size.height;
navigateToLoginPage() {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => LoginPage()),
);
}
navigateToCreateAccountPage() {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => CreateAccountPage()),
);
}
return null;
}
}
Я импортировал все, что мне нужно, в эти классы, синтаксис идеален, но эмулятор показывает мне эту ошибку:
«NoSuchMethodError: метод ‘*’ был вызван с нулевым значением. Получатель: null Пытался вызвать: * (0.55)»
Комментарии:
1. Вы получаете доступ к значениям ‘null’ при вызове height и width.
get width => null;
2. Вау, спасибо! Это было так, но как я могу установить пустое значение в этих методах получения?
3. Почему вы хотите, чтобы получатель был пустым? Разве вы не хотите получить доступ к реальному значению при его использовании в других местах? Не имеет смысла использовать средство получения и присваивать ему нулевое значение или оставлять его неопределенным.
4. Я пытался создать отдельный файл для глобальных переменных и констант, но я не смог найти способ реализовать эти параметры в других классах без использования getter, вы знаете какую-нибудь альтернативу?
Ответ №1:
Вы должны просто поместить их в класс и определить там свои методы и свойства. Один из способов сделать это:
class GlobalVariables {
static MediaQueryData _mediaQueryData;
static double screenWidth;
static double screenHeight;
navigateToLoginPage(BuildContext context) {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => LoginPage()),
);
}
void init(BuildContext context) {
_mediaQueryData = MediaQuery.of(context);
screenWidth = _mediaQueryData.size.width;
screenHeight = _mediaQueryData.size.height;
}
}
Вам нужно вызвать init
метод только один раз для каждой создаваемой вами страницы, после чего вы сможете получить доступ к свойствам, например:
class Example extends StatelessWidget {
@override
Widget build(BuildContext context) {
GlobalVariables().init(context);
final globalVariables = GlobalVariables();
double width = GlobalVariables.screenWidth;
return Scaffold(
body: Column(
children: [
RaisedButton(
onPressed: () {
globalVariables.navigateToLoginPage(context);
}
)
Text("$width")
],)
);
}
}
Комментарии:
1. Большое спасибо! Вы действительно помогли мне: D, но еще один вопрос, есть другой способ получить доступ к
screenWidth
orscreenHeight
из GlobalVariables без создания другой переменной во всех классах, напримерdouble width = GlobalVariables.screenWidth
?2. Просто создайте
static Size screen;
и назначьтеscreen = _mediaQueryData.size;
, затем для доступа просто сделайтеfinal screens = GlobalVariables.screen;
, например:screens.width