Использование контроллера Flutter GetX для setState()

Я хочу вызвать значение строки в моем контроллере, вот мой контроллер:

class SplashScreenController extends GetxController {
  late String one = _setImage();

  @override
  void onInit() {
    _initPackageInfo();
    _setImage();
    Timer(Duration(seconds: 5), () => Get.offNamed(Routes.DASHBOARD));
    super.onInit();
  }

  @override
  void onClose() {}

  PackageInfo _packageInfo = PackageInfo(
    appName: 'Unknown',
    packageName: 'Unknown',
    version: 'Unknown',
    buildNumber: 'Unknown',
    buildSignature: 'Unknown',
  );

  Future<void> _initPackageInfo() async {
    _packageInfo = await PackageInfo.fromPlatform();
  }

  String _setImage() {
    print(_packageInfo.packageName);

    ///main package
    if (_packageInfo.appName == 'x1') {
      return Images.x1;
    } else if (_packageInfo.packageName == 'com.package.package1') {
      return Images.package1;
    } else {
      return Images.x1;
    }
  }
}

Я хочу вызвать функцию setImage() в своем виджете, но после вызова возникает проблема, вы можете увидеть ее здесь:

[Get] обнаружено ненадлежащее использование GetX. Вы должны использовать GetX или Obx только для конкретного виджета, который будет обновлен. Если вы видите эту ошибку, возможно, вы не вставили какие-либо наблюдаемые переменные в GetX/Obx. или вставьте их за пределы области, которую GetX считает подходящей для обновления (пример: GetX => HeavyWidget => variableObservable). Если вам нужно обновить родительский виджет и дочерний виджет, оберните каждый из них в Obx/GetX.

А вот вид, где я вызываю функцию контроллера:

Widget build(BuildContext context) {
    return Obx(() => Scaffold(
          body: Container(
              color: const Color.fromARGB(255, 255, 255, 255),
              alignment: AlignmentDirectional.center,
              child: Image.asset(controller.one)),
        ));
  }

Есть ли способ исправить это, чтобы я мог получить доступ к _setImage() в моем представлении?

Друзья, не позволяйте друзьям использовать GetX! Если вы участвуете в флаттер-дискорде, введите ?getx. В противном случае, это семиминутное видео описывает хорошее подробное описание «почему бы и не getx»: youtu.be/zlIgy4es5Ts

Randal Schwartz 18.01.2023 09:05

Я знал это, я использовал flutter_bloc раньше, но я помогаю нескольким проектам, используя GetX, и эта проблема проявляется

fairycatto 18.01.2023 09:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть эта ошибка, потому что вы оборачиваете свой код в Obx, но не используете наблюдаемую переменную внутри.

Измените свой код следующим образом:

class SplashScreenController extends GetxController {
  late String one = ''.obs; // This is the observable variable that you need

  @override
  void onInit() {
    _initPackageInfo();
    _setImage();
    Timer(Duration(seconds: 5), () => Get.offNamed(Routes.DASHBOARD));
    super.onInit();
  }

  @override
  void onClose() {}

  PackageInfo _packageInfo = PackageInfo(
    appName: 'Unknown',
    packageName: 'Unknown',
    version: 'Unknown',
    buildNumber: 'Unknown',
    buildSignature: 'Unknown',
  );

  Future<void> _initPackageInfo() async {
    _packageInfo = await PackageInfo.fromPlatform();
  }

  void _setImage() {
    print(_packageInfo.packageName);

    ///main package
    if (_packageInfo.appName == 'x1') {
       one = Images.x1;
    } else if (_packageInfo.packageName == 'com.package.package1') {
       one = Images.package1;
    } else {
       one = Images.x1;
    }
  }
}

И для виджета:

Widget build(BuildContext context) {
    return Obx(() => Scaffold(
      body: Container(
        color: const Color.fromARGB(255, 255, 255, 255),
        alignment: AlignmentDirectional.center,
        child: controller.one.isNotEmpty 
          ? Image.asset(controller.one)) 
          : const SizedBox.shrink(),
    ));
}

Вызывает ли он мою функцию _setImage()?

fairycatto 18.01.2023 07:26

Вы уже вызываете свою функцию _setImage() внутри onInit в вашем контроллере.

Moïse Rajesearison 18.01.2023 07:28

хорошо, но _setImage() уже вызывается внутри Image.asset()? потому что я хочу получить строковое значение _setImage()

fairycatto 18.01.2023 07:39

Вам больше не нужно вызывать _setImage() в Image.asset, потому что вы уже вызвали его в onInit вашего контроллера. Результат функции уже хранится в одной переменной obs, поэтому обычно вы получаете правильный результат.

Moïse Rajesearison 18.01.2023 07:58

Другие вопросы по теме