Ошибка при вызове сбоя компонентов моего приложения

#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 or screenHeight из GlobalVariables без создания другой переменной во всех классах, например double width = GlobalVariables.screenWidth ?

2. Просто создайте static Size screen; и назначьте screen = _mediaQueryData.size; , затем для доступа просто сделайте final screens = GlobalVariables.screen; , например: screens.width