【发布时间】:2021-07-23 23:11:24
【问题描述】:
我是 Flutter 的新手,我尝试构建一个应用程序,它以有状态小部件 TabScreen 作为主路由,其中包含一个 Scaffold。 Scaffold 的主体是根据底部导航栏中的选定索引构建的,效果很好。我的问题是 AppBar 的操作管理。 AppBar 应该为每个“主体屏幕”提供不同的操作,但这些操作会影响不同主体屏幕内的数据。
例如:在 Screen1 类中,我们有一个变量 List list1。对于 Screen1,AppBar 应提供“清除列表 1”选项,以删除所有列表 1 项,但在 Screen2 上应提供“清除 Screen2 列表”选项。
我的想法是创建一个新的 AppBar 类,将其导入我的 Screen1、Screen2、Screen3 类中,并按照this 帖子中的说明在这些屏幕中创建和配置 appBar。 有没有一种方法可以在我的 Screen1 类中不仅定义正文,还定义 AppBar 并将它们都返回到 TabScreen 父级?我认为这将是最简单的解决方案,但我不知道如何做得更好。
class _TabScreenState extends State<TabScreen> {
int _selectedPageIndex;
final List<Map<String, Object>> _pages = [
{
'page': Screen1(),
'title': 'Screen1',
},
{
'page': Screen2(),
'title': 'Screen2',
},
{
'page': Screen3(),
'title': 'Screen3',
},
];
@override
Widget build(BuildContext context) {
final appBar = AppBar(
title: Text('Screen X'),
actions: [
PopupMenuButton(
onSelected: (selectedValue) {
setState(() {
if (selectedValue == 0) {
filterOn = true;
Provider.of<Screen1Data>(context, listen: false).clear();
} else {
Provider.of<Screen1Data>(context, listen: false).reset();
filterOn = false;
}
});
},
icon: Icon(Icons.more_vert),
itemBuilder: (_) => [
PopupMenuItem(child: Text('Reset'), value: 0),
PopupMenuItem(
child: Text('Clear List'), value: 1),
],
),
],
);
return Scaffold(
appBar: appBar,
body: _pages[_selectedPageIndex]['page'],
bottomNavigationBar: bottomBar,
);
}
Screen1 内容可能如下所示:
class Screen1 extends StatefulWidget {
@override
_Screen1State createState() => _Screen1State();
}
class _Screen1State extends State<Screen1> {
List<String> list1;
@override
Widget build(BuildContext context) {
return Text(list1[0]);
}
}
【问题讨论】:
标签: flutter scaffold flutter-appbar