Пользуюсь пакетом 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());
}
}
Таким образом, нет необходимости инициализировать каждый контроллер на каждой странице.
в параметрах элементов BottomNavigationBar вы определили как controller.changingBottom()
, но в файле контроллера ничего подобного нет
@CavinMacwan, это здесь, я полагаю, вы четко прочитали код, спасибо
На домашней странице добавьте метод 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
, он не будет удалять контроллер каждый раз.
Спасибо за ответ, но разве это не проблема запретить контроллер закрытия?!! Разве это не приводит к большему использованию оперативной памяти?
Наконец я получил решение ..
Мне пришлось использовать Get.find<xController>()
на каждой странице пользовательского интерфейса, я использую в ней любой класс контроллера.
Widget build(BuildContext context) {
return GetBuilder<CartController>(
init: Get.find<CartController>(),
builder: (controller) => Scaffold(),
И после тестирования работает хорошо.
Друзья, не позволяйте друзьям использовать GetX! Если вы участвуете в флаттер-дискорде, введите ?getx. В противном случае, это семиминутное видео описывает хорошее подробное описание «почему бы и не getx»: youtu.be/zlIgy4es5Ts