I have a NavBar
which I control via a Provider
:
class BottomNavBarProvider extends ChangeNotifier {
final PageController navigationController = PageController(initialPage: 0);
int selectedTabIndex = 0;
BottomNavBarProvider() {}
void selectTab(int index) {
navigationController.jumpToPage(index);
selectedTabIndex = navigationController.page?.round() ?? 0;
notifyListeners();
}
}
Problem:
I think the problem is that I am using a Provider
to store my PageContrller
so if I push to another page, where the BottomBar
is used, it is always attached to the same one from the provider. So I guess I need a way to properly dispose
the PageController
. But how do I do that?
I am using it inside my ApplicationContainer
:
class ApplicationContainer extends StatelessWidget {
@override
Widget build(BuildContext context) {
initSizeService(context);
return Scaffold(
body: PageView(
controller:
Provider.of<BottomNavBarProvider>(context).navigationController,
children: <Widget>[
HomePage(),
EntryPage(),
VitalsHistoryPage(
Provider.of<VitalsHistoryProvider>(context),
),
SettingsPage(),
],
physics: NeverScrollableScrollPhysics(),
),
);
}
}
The problem is that I also have a Onboarding-Process
in my app and at the last page of it I cam calling Navigator.pushReplacementNamed(context, '/');
which is handled by my Router
:
static Route<dynamic> generateRoute(RouteSettings settings) {
switch (settings.name) {
case '/':
return MaterialPageRoute(
builder: (context) => ApplicationContainer(),
);
...
But this crashes my NavBar
:
The following assertion was thrown while handling a gesture: ScrollController attached to multiple scroll views. 'package:flutter/src/widgets/scroll_controller.dart': Failed assertion: line 109 pos 12: '_positions.length == 1'
Here is the Stack
:
When the exception was thrown, this was the stack #2 ScrollController.position package:flutter/…/widgets/scroll_controller.dart:109 #3 PageController.jumpToPage package:flutter/…/widgets/page_view.dart:206 #4 BottomNavBarProvider.selectTab package:onkobutler/providers/bottom_nav_bar_provider.dart:10 #5 BottomNavBarItem._fireOnTap package:onkobutler/…/bottom_navigation_bar/bottom_nav_bar_item.dart:34 #6 BottomNavBarItem.build. package:onkobutler/…/bottom_navigation_bar/bottom_nav_bar_item.dart:46
And the associated code:
List<BottomNavBarItem> _buildBottomNavBarItems(BuildContext context) {
return [
BottomNavBarItem(
index: 0,
selectedIndex: Provider.of<BottomNavBarProvider>(context, listen: true)
.selectedTabIndex,
text: 'Startseite',
iconBaseUrl: 'images/icons/home_',
onTap:
Provider.of<BottomNavBarProvider>(context, listen: false).selectTab,
),
BottomNavBarItem(
index: 1,
selectedIndex: Provider.of<BottomNavBarProvider>(context, listen: true)
.selectedTabIndex,
text: 'Eintrag',
iconBaseUrl: 'images/icons/add_black.png',
hasDynamicIconColor: false,
onTap: () {
AppRouter.openEntryProcedure(context);
},
),
BottomNavBarItem(
index: 2,
selectedIndex: Provider.of<BottomNavBarProvider>(context, listen: true)
.selectedTabIndex,
text: 'Verlauf',
iconBaseUrl: 'images/icons/progress_',
onTap:
Provider.of<BottomNavBarProvider>(context, listen: false).selectTab,
),
BottomNavBarItem(
index: 3,
selectedIndex: Provider.of<BottomNavBarProvider>(context, listen: true)
.selectedTabIndex,
text: 'Einstellungen',
iconBaseUrl: 'images/icons/settings_',
onTap:
Provider.of<BottomNavBarProvider>(context, listen: false).selectTab,
),
];
}
}
Why is this happening? What am I missing here?
Let me know if you need any more info!