I have a Navigation bar, and the list of tab widgets are all initialised in a controller called RootController
.
I happen to add another tab to the list called JobsView()
but when i try to move to navigate to the tab it gives me this error:
I have tried initialising the controller it said was missing but i don't really understand where it is missing because looks like all my controllers are initialized. What's the trick?
I will add the following snippets:
JobsView()
root_controller
class JobsView extends GetView<EServicesController> {
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: new FloatingActionButton(
child: new Icon(Icons.add, size: 32, color: Get.theme.primaryColor),
onPressed: () => {Get.offAndToNamed(Routes.E_SERVICE_FORM)},
backgroundColor: Get.theme.colorScheme.secondary,
),
floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,
body: RefreshIndicator(
onRefresh: () async {
Get.find<LaravelApiClient>().forceRefresh();
controller.refreshEServices(showMessage: true);
Get.find<LaravelApiClient>().unForceRefresh();
},
child: CustomScrollView(
controller: controller.scrollController,
physics: AlwaysScrollableScrollPhysics(),
shrinkWrap: false,
slivers: <Widget>[
SliverAppBar(
backgroundColor: Get.theme.scaffoldBackgroundColor,
expandedHeight: 140,
elevation: 0.5,
primary: true,
pinned: false,
floating: true,
iconTheme: IconThemeData(color: Get.theme.primaryColor),
title: Text(
"My Services".tr,
style: Get.textTheme.headline6.merge(TextStyle(color: Get.theme.primaryColor)),
),
centerTitle: true,
automaticallyImplyLeading: false,
leading: new IconButton(
icon: new Icon(Icons.arrow_back_ios, color: Get.theme.primaryColor),
onPressed: () => {Get.back()},
),
bottom: HomeSearchBarWidget(),
flexibleSpace: FlexibleSpaceBar(
collapseMode: CollapseMode.parallax,
background: Container(
width: double.infinity,
padding: EdgeInsets.symmetric(vertical: 75),
decoration: new BoxDecoration(
gradient: new LinearGradient(
colors: [Get.theme.colorScheme.secondary.withOpacity(1), Get.theme.colorScheme.secondary.withOpacity(0.2)],
begin: AlignmentDirectional.topStart,
//const FractionalOffset(1, 0),
end: AlignmentDirectional.bottomEnd,
stops: [0.1, 0.9],
tileMode: TileMode.clamp),
borderRadius: BorderRadius.only(topLeft: Radius.circular(5), topRight: Radius.circular(5)),
),
)).marginOnly(bottom: 42),
),
SliverToBoxAdapter(
child: Wrap(
children: [
Container(
height: 60,
child: ListView(
primary: false,
shrinkWrap: true,
scrollDirection: Axis.horizontal,
children: List.generate(CategoryFilter.values.length, (index) {
var _filter = CategoryFilter.values.elementAt(index);
return Obx(() {
return Padding(
padding: const EdgeInsetsDirectional.only(start: 20),
child: RawChip(
elevation: 0,
label: Text(_filter.toString().tr),
labelStyle: controller.isSelected(_filter)
? Get.textTheme.bodyText2.merge(TextStyle(color: Get.theme.primaryColor))
: Get.textTheme.bodyText2,
padding: EdgeInsets.symmetric(horizontal: 12, vertical: 15),
backgroundColor: Get.theme.focusColor.withOpacity(0.1),
selectedColor: Get.theme.colorScheme.secondary,
selected: controller.isSelected(_filter),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
showCheckmark: true,
checkmarkColor: Get.theme.primaryColor,
onSelected: (bool value) {
controller.toggleSelected(_filter);
controller.loadEServicesOfCategory(filter: controller.selected.value);
},
),
);
});
})),
),
ServicesListWidget(),
],
),
),
],
),
),
);
}
}
class RootController extends GetxController {
final currentIndex = 0.obs;
final notificationsCount = 0.obs;
final customPages = <CustomPage>[].obs;
NotificationRepository _notificationRepository;
CustomPageRepository _customPageRepository;
RootController() {
_notificationRepository = new NotificationRepository();
_customPageRepository = new CustomPageRepository();
}
@override
void onInit() async {
await getCustomPages();
if (Get.arguments != null && Get.arguments is int) {
changePageInRoot(Get.arguments as int);
} else {
changePageInRoot(0);
}
super.onInit();
}
List<Widget> pages = [
HomeView(),
JobsView(),
ReviewsView(),
MessagesView(),
AccountView(),
];
Widget get currentPage => pages[currentIndex.value];
/**
* change page in route
* */
void changePageInRoot(int _index) {
currentIndex.value = _index;
}
void changePageOutRoot(int _index) {
currentIndex.value = _index;
Get.offNamedUntil(Routes.ROOT, (Route route) {
if (route.settings.name == Routes.ROOT) {
return true;
}
return false;
}, arguments: _index);
}
Future<void> changePage(int _index) async {
if (Get.currentRoute == Routes.ROOT) {
changePageInRoot(_index);
} else {
changePageOutRoot(_index);
}
await refreshPage(_index);
}
Future<void> refreshPage(int _index) async {
switch (_index) {
case 0:
{
await Get.find<HomeController>().refreshHome();
break;
}
case 2:
{
await Get.find<MessagesController>().refreshMessages();
break;
}
}
}
void getNotificationsCount() async {
notificationsCount.value = await _notificationRepository.getCount();
}
Future<void> getCustomPages() async {
customPages.assignAll(await _customPageRepository.all());
}
}
CodePudding user response:
you need to initialise controller before used it as mention in error logs. so you can try this:
So before use any controller in GETX you need to initialise first before use it.
@override
Widget build(BuildContext context) {
Get.put(EServicesController()); // ADD this line
return Scaffold(...);
}
You learn more about GETX controller check out this link
Checkout package Readme for more details.