Flutter: навигация Getx возвращает ноль

Пользуюсь пакетом GetX давно, но иногда страдаю от ошибок..

Теперь у меня есть bottomNavigationBar, который имеет 5 страниц для навигации (Предложения - Категории - Корзина - Избранное - Аккаунт).

Моя проблема:

Когда я перехожу от индекса 0 к индексу 2 (например), все идет нормально, но когда я хочу вернуться к индексу 0, здесь приложение вылетает и выдает мне эту ошибку:

Оператор проверки null, используемый для нулевого значения

Точно так же я использовал с другим проектом, но там я использовал TabBar, я использовал его нормально без этой ошибки, но здесь в нижней панели навигации это происходит.

На самом деле я не верю, что ошибка из-за вида виджета, но очень хочу ее решить.

Примечание :

Я создал HomePageController, в котором я определил все bottomNavigationBar операции, такие как изменение индекса, списка страниц и т. д.

И для каждой страницы есть свой контроллер, даже когда я возвращаюсь на страницу, которая использует HomePageController, он вылетает!!!

Это простой мой код:

class HomePageController extends GetxController {
  static HomePageController instance = HomePageController();

  late TextEditingController categoriesSearchController;

  @override
  void onInit() {
    super.onInit();
    categoriesSearchController = TextEditingController();
  }

  int bottomNavIndex = 0;

  changeBottomIndex(int index) {
    bottomNavIndex = index;
    update();
  }


  List<Widget> bottomScreens = const [
    Offers(),
    Categories(),
    Cart(),
    Favorite(),
    Account(),
  ];

  List<ItemModel> meatsList = [
    ItemModel(
      title: 'Thigh',
      image: 'assets/images/home_page/pin_thigh.png',
      description: '1 Kg',
      price: 1.72,
    ),
    ItemModel(
      title: 'Breast',
      image: 'assets/images/home_page/breasts2.jpg',
      description: '1 Kg',
      price: 1.65,
    ),
    ItemModel(
      title: 'lamb',
      image: 'assets/images/home_page/lamb.jpeg',
      description: '1 Kg',
      price: 6.55,
    ),
  ];
}
class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GetBuilder<HomePageController>(
      builder: (controller) => controller != null
          ? SafeArea(
              child: Scaffold(
                backgroundColor: AppColors.whiteColor,
                bottomNavigationBar: BottomNavigationBar(
                  items: controller.changingBottom(),
                  currentIndex: controller.bottomNavIndex,
                  type: BottomNavigationBarType.fixed,
                  selectedItemColor: AppColors.onBoardingButton,
                  onTap: (index) {
                    controller.changeBottomIndex(index);
                  },
                ),
                body: controller.bottomScreens[controller.bottomNavIndex],
              ),
            )
          : const Center(
              child: CircularProgressIndicator(),
            ),
    );
  }
}

Обновлять:

Я забыл упомянуть, что я использую класс GetX Binding для инициализации всех контроллеров, когда это необходимо, например так:

class Binding extends Bindings {
  @override
  void dependencies() {
    Get.put(() => DatabaseController());
    Get.lazyPut(() => AuthController());
    Get.lazyPut(() => HomePageController());
    Get.lazyPut(() => ProductsController());
    Get.lazyPut(() => CartController());
  }
}

Таким образом, нет необходимости инициализировать каждый контроллер на каждой странице.

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

Randal Schwartz 19.01.2023 06:00

в параметрах элементов BottomNavigationBar вы определили как controller.changingBottom(), но в файле контроллера ничего подобного нет

Cavin Macwan 19.01.2023 10:41

@CavinMacwan, это здесь, я полагаю, вы четко прочитали код, спасибо

Muhammad Qazmouz 19.01.2023 22:05
Стоит ли изучать 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
3
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

На домашней странице добавьте метод init и autoRemove в GetBuilder следующим образом:

class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GetBuilder<HomePageController>(
      init:HomePageController(),
      autoRemove:false,
      builder: (controller) => controller != null
          ? SafeArea(
              child: Scaffold(
                backgroundColor: AppColors.whiteColor,
                bottomNavigationBar: BottomNavigationBar(
                  items: controller.changingBottom(),
                  currentIndex: controller.bottomNavIndex,
                  type: BottomNavigationBarType.fixed,
                  selectedItemColor: AppColors.onBoardingButton,
                  onTap: (index) {
                    controller.changeBottomIndex(index);
                  },
                ),
                body: controller.bottomScreens[controller.bottomNavIndex],
              ),
            )
          : const Center(
              child: CircularProgressIndicator(),
            ),
    );
  }
}

Используя init, он восстановит ваш контроллер, если он будет утилизирован. И, используя autoRemove to false, он не будет удалять контроллер каждый раз.

Спасибо за ответ, но разве это не проблема запретить контроллер закрытия?!! Разве это не приводит к большему использованию оперативной памяти?

Muhammad Qazmouz 21.01.2023 16:11
Ответ принят как подходящий

Наконец я получил решение .. Мне пришлось использовать Get.find<xController>() на каждой странице пользовательского интерфейса, я использую в ней любой класс контроллера.

Widget build(BuildContext context) {
    return GetBuilder<CartController>(
      init: Get.find<CartController>(),
      builder: (controller) => Scaffold(),

И после тестирования работает хорошо.

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