我的屏幕上有一个控制器,它显示一个抽屉。控制器作为参数传递给显示抽屉的主屏幕。抽屉主体应根据所选项目进行更改。
class HomeScreen extends StatefulWidget {
final HomeController controller;
HomeScreen(this.controller);
@override
_HomeScreenState createState() => new _HomeScreenState(this.controller);
}
class _HomeScreenState extends State<HomeScreen>
with SingleTickerProviderStateMixin {
HomeController controller;
TabController _tabController;
_HomeScreenState(this.controller);
@override
void initState() {
super.initState();
_tabController =
TabController(length: controller.tabItems.length, vsync: this);
}
@override
Widget build(BuildContext context) {
switch (controller.getMenuType()) {
case MenuType.drawer:
return buildDrawer();
case MenuType.tabbarbottom:
return buildTopTabbar();
case MenuType.tabbartop:
return buildTopTabbar();
default:
return buildDrawer();
}
}
Widget buildDrawer() {
return Scaffold(
appBar: AppBar(title: Text("test")),
body: _buildDrawerBody(),
drawer: Drawer(
child: ListView(padding: EdgeInsets.zero, children: _getDrawerTiles()),
),
);
}
用户选择显示选项卡栏或抽屉的配置。在抽屉的情况下,问题在于,即使在调用了setState并且drawerbody函数正在使用正确的页面创建新的小部件页面生成器之后,它也不会在屏幕上反映(或刷新
Widget _buildDrawerBody() {
Page page = controller.getSelectedPage();
PageBuilderController pageController = PageBuilderController(page: page);
return PageBuilder(pageController);
}
List<Widget> _getDrawerTiles() {
Widget header = DrawerHeader(
child: Text('Drawer Header'),
decoration: BoxDecoration(
color: Colors.blue,
),
);
List<Widget> tiles = controller.tabItems
.map<Widget>((tab) => ListTile(
title: Text(tab.label),
onTap: () {
// Update the state of the app
// ...
setState(() {
controller.selectedTab = tab;
Navigator.pop(context);
});
},
))
.toList(growable: true);
tiles.insert(0, header);
return tiles;
}
我已经确保getselectedpage返回正确的结果。
发布于 2018-11-06 13:55:09
我遇到的情况是,当您将小部件放在build方法之外的方法中时,它们并不能像预期的那样工作。尝试在build方法中将buildDrawer和_buildDrawerBody声明为最终小部件,看看是否会有所不同。
@override
Widget build(BuildContext context) {
final Widget _buildDrawerBody = ...
final Widget buildDrawer = Scaffold(
appBar: AppBar(title: Text("test")),
body: _buildDrawerBody,
drawer: Drawer(
child: ListView(padding: EdgeInsets.zero, children: _getDrawerTiles()),
),
);
switch (controller.getMenuType()) {
case MenuType.drawer:
return buildDrawer;
case MenuType.tabbarbottom:
return buildTopTabbar();
case MenuType.tabbartop:
return buildTopTabbar();
default:
return buildDrawer;
}
}
本文可能会提供一些关于创建小部件的最佳实践的见解:https://medium.com/flutter-io/out-of-depth-with-flutter-f683c29305a8
https://stackoverflow.com/questions/53170352
复制相似问题