У меня есть BottomNavigationBar в виджете без состояния. Я использую ViewModelProvider, чтобы контролировать изменение вкладки при событии onTap. У меня нет проблем с навигацией с помощью BottomNavigationBar, но я не смог управлять панелью навигации изнутри тела. Я использую следующий метод, я пытался использовать streambuilder для управления навигацией, но streambuilder будет распоряжаться содержимым при переходе на другую вкладку, а это не то, что мне нужно. Я не могу нажать кнопку на странице профиля и перейти на домашнюю страницу.
Ниже представлен мой виджет для BottomNavigationBar.
class BottomNavigationView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ViewModelProvider<BottomNavigationViewModel>.withConsumer(
viewModel: BottomNavigationViewModel(),
builder: (context, model, child) => Scaffold(
primary: false,
body: IndexedStack(
children: <Widget>[
BrowseView(),
HomeView(),
ProfileView(),
],
index: model.currentIndex,
),
bottomNavigationBar: BottomNavigationBar(
type: BottomNavigationBarType.fixed,
backgroundColor: Colors.white,
currentIndex: model.currentIndex,
onTap: model.changeView,
items: [
BottomNavigationBarItem(
icon: new Icon(Icons.search),
title: SizedBox.shrink(),
),
BottomNavigationBarItem(
icon: new Icon(Icons.home),
title: SizedBox.shrink(),
),
BottomNavigationBarItem(
icon: new Icon(WineIcon.person),
title: SizedBox.shrink(),
),
],
),
),
);
}
}
Панель навигации Модель
class BottomNavigationViewModel extends ChangeNotifier {
int _currentIndex = 2;
int get currentIndex => _currentIndex;
void changeView(int index) {
_currentIndex = index;
notifyListeners();
}
}
Просмотр профиля и Просмотр профиля Модель
class ProfileView extends StatelessWidget {
const ProfileView ({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return ViewModelProvider<ProfileViewModel>.withConsumer(
viewModel: ProfileViewModel(),
builder: (context, model, child) => Scaffold(
body: Center(
child: RaisedButton(
onPressed: ()=> model.goHome(),
child:Text('Go to Home'),
),
)
),
);
}
}
class ProfileViewModel extends ChangeNotifier {
final BottomNavigationViewModel _bottomNavigationBar =
locator<BottomNavigationViewModel>();
void goHome() {
_bottomNavigationBar.changeView(1);
}
}