Как я могу получить доступ к переменным, созданным методом init моего унаследованного класса? - PullRequest
0 голосов
/ 07 января 2020

Я создаю приложение, используя Flutter с Dart, и хочу создать базовый класс для конфигурации приложения. Затем, при создании нового экрана, я хочу создать класс ScreenConfig extends BaseConfig и добавить указанную конфигурацию c для этого экрана поверх базовой конфигурации. Я делаю это, чтобы удалить шаблон необходимости извлечения MediaQueryData, а затем каждый раз при создании новой конфигурации экрана устанавливаю соответствующие размеры.

Базовый класс

class BaseConfig {
  double screenWidth;
  double screenHeight;

  double statusBarHeight;
  double navigationBarHeight;

  /// [safeScreenHeight] is the height of the device screen when
  /// the height of the statusbar and navigationbar is subtracted
  double safeScreenHeight;

  void init(BuildContext context) {
    MediaQueryData mediaQuery = MediaQuery.of(context);
    screenHeight = mediaQuery.size.height;
    screenWidth = mediaQuery.size.width;

    statusBarHeight = mediaQuery.padding.top;
    navigationBarHeight = kBottomNavigationBarHeight;

    safeScreenHeight = screenHeight - (statusBarHeight + navigationBarHeight);
  }
}

Класс, расширяющий базовый класс

class LoginScreenConfig extends BaseConfig {

  static Size busAnimation;
  static Size logo;
  static Size logoText;
  static Size upperLoginButton;
  static Size upperRegisterButton;
  static Size textFormField;
  static Size submitButton;

  static Size mainContainer;
  static Size yellowContainer;
  static Size greyContainer;
}

@override
void init(BuildContext context) {
  super.init(context);
}

Теперь я хочу (внутри LoginScreenConfig.init()), например, установить busAnimation равным Size(screenWidth * 0.5, safeScreenHeight * 0.3). Но когда я пытаюсь получить доступ к super.init() для установки переменных в базовом классе, я получаю ошибку Invalid context for 'super' invocation. Я даже не могу получить доступ к полям родительского класса, просто написав super.field. Чего мне здесь не хватает?

КСТАТИ: Любые предложения о том, как мне лучше управлять настройками приложения, очень востребованы (все еще учатся)!

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Я официально слепой. Метод init LoginScreenConfig не был частью унаследованного класса. Я сделал на сегодня.

0 голосов
/ 07 января 2020

Расширьте свой класс конфигурации из InheritedWidget, чтобы вы могли вызывать его из своих виджетов, используя BaseConfig.of(context).busAnimation. Вот пример кода:

import 'package:flutter/material.dart';
import 'package:meta/meta.dart';

class BaseConfig extends InheritedWidget {
  final Size busAnimation;
  final Size logo;
  final Size logoText;
  final Size upperLoginButton;
  final Size upperRegisterButton;
  final Size textFormField;
  final Size submitButton;
  final Size mainContainer;
  final Size yellowContainer;
  final Size greyContainer;

  BaseConfig({
    this.busAnimation,
    this.logo,
    this.logoText,
    this.upperLoginButton,
    this.upperRegisterButton,
    this.textFormField,
    this.submitButton,
    this.mainContainer,
    this.yellowContainer,
    this.greyContainer,
    @required Widget child,
  }) : super(child: child);

  static BaseConfig of(BuildContext context) {
    return context.inheritFromWidgetOfExactType(BaseConfig);
  }

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) => false;
}

Затем в вашем основном файле вы упаковываете приложение с помощью BaseConfig

import 'package:flutter/material.dart';

import 'base_config.dart';
import 'my_app.dart';

void main() {
  runApp(BaseConfig(
    busAnimation: "something",
    logo: "something else",
    logoText: "and so on",
    ...
    child: MyApp(),
  ));
}
...