我在无状态小部件中有一个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);
}
}
答案 0 :(得分:0)
不完全理解“无法从体内控制导航栏”的含义。但是我认为您的意思是当您在每个页面中导航时btmnav不见了?您正在使用Indexstack保持页面内部状态的中途。我没有使用streambuilder,而是为每个页面的导航器创建了要使用的全局密钥。
Navigator(
key: 1 key for each tab here,
onGenerateRoute: (settings) => MaterialPageRoute(
settings: settings,
builder: (context) => page,
), // this will generate your pages
如果要替换整个页面,则
Navigator.of(context,rootNavigator: true).push(MaterialPageRoute(builder: (context) =>anotherpage)
否则只需将rootNavigator设置为false