【问题标题】:How can I show/hide menu items in Nav Drawer and enable/disable overflow menu items in App Bar programatically in Flutter?如何在 Flutter 中以编程方式在 Nav Drawer 中显示/隐藏菜单项并在 App Bar 中启用/禁用溢出菜单项?
【发布时间】:2020-03-17 14:06:19
【问题描述】:

我一直在尝试按照标题所说的做,但在网上根本找不到任何信息。在常规的 Android 代码中,这就像查找抽屉/工具栏的 ViewID、获取菜单项以及在菜单项上调用 .setEnabled() 或 .setVisible() 一样简单。我如何在 Flutter 中做到这一点?基本上,当在 webView 中加载某个 url 时,我想以编程方式启用/禁用或显示/隐藏(在 webview_flutter 的 onLoadStart 和 onLoadFinished 方法中)。作为参考,我的脚手架:

return new Scaffold(
  appBar: new AppBar(
    title: new Text(appBarTitle),
    actions: <Widget>[
      IconButton(
        icon: Icon(
          Icons.refresh,
          color: Colors.white,
        ),
        onPressed: () {
          webView.reload();
        },
      ),
      PopupMenuButton<Choice>  ( //showchoice??
        onSelected: _select,
        itemBuilder: (BuildContext context) {
          return choices.map((Choice choice) {
            return PopupMenuItem<Choice>(
              value: choice,
              child: Text(choice.title),
            );
          }).toList();
        },
      ),
    ],
  ),

  drawer: Drawer(
    child: ListView(
      children: <Widget>[
        new DrawerHeader(
          child: Column (
            crossAxisAlignment: CrossAxisAlignment.start,
            mainAxisSize: MainAxisSize.max,
            mainAxisAlignment: MainAxisAlignment.end,
            children: <Widget> [
            Text(
              'HLS Grades',
              textAlign: TextAlign.left,
              style: TextStyle(
                color: Colors.white,
                fontSize: 20,
              ),
            ),
            Text(
              'Canvas Online Grading System',
              style: TextStyle(
                color: Colors.white,
                fontSize: 12,
              ),
            ),
        ]),
        decoration: BoxDecoration(
        color: Colors.blue,
        ),
      ),
        Divider(),
        Text(
          'Course Actions',
          style: TextStyle(
            color: Colors.black,
            fontSize: 12,
          ),
        ),
        ListTile(
          leading: Icon(MyFlutterApp.assignment),
          title: Text('Assignments'),
          onTap: () {
            setState(() => _selectedDrawerIndex = 0);
            _onSelectNavItem(0);
          },
        ),
        ListTile(
          leading: Icon(MyFlutterApp.grades),
          title: Text('Grades'),
          onTap: () {
            setState(() => _selectedDrawerIndex = 1);
            _onSelectNavItem(1);
          },
        ),
        ListTile(
          leading: Icon(MyFlutterApp.people),
          title: Text('Users'),
          onTap: () {
            setState(() => _selectedDrawerIndex = 2);
            _onSelectNavItem(2);
          },
        ),
        ListTile(
          leading: Icon(MyFlutterApp.syllabus),
          title: Text('Syllabus'),
          onTap: () {
            setState(() => _selectedDrawerIndex = 3);
            _onSelectNavItem(3);
          },
        ),
        ListTile(
          leading: Icon(MyFlutterApp.discussions),
          title: Text('Discussions'),
          onTap: () {
            setState(() => _selectedDrawerIndex = 4);
            _onSelectNavItem(4);
          },
        ),
        Divider(),
        Text(
          'App Actions',
          style: TextStyle(
            color: Colors.black,
            fontSize: 12,
          ),
        ),
        ListTile(
          leading: Icon(MyFlutterApp.logout),
          title: Text('Logout'),
          onTap: () {
            _onSelectNavItem(5);
          },
        ),
        ListTile(
          leading: Icon(MyFlutterApp.settings),
          title: Text('Settings'),
          onTap: () {
            _onSelectNavItem(6);
          },
        ),
      ],
    ),
  ),

以及我选择的类的代码:

 class Choice {
  const Choice({this.title, this.icon});

  final String title;
  final IconData icon;
}

const List<Choice> choices = const <Choice>[
  const Choice(title: 'All Grading Periods'),
  const Choice(title: 'Trimester 1'),
  const Choice(title: 'Trimester 2'),
  const Choice(title: 'Trimester 3'),
];

class ChoiceCard extends StatelessWidget {
  const ChoiceCard({Key key, this.choice}) : super(key: key);

  final Choice choice;

  @override
  Widget build(BuildContext context) {
    final TextStyle textStyle = Theme.of(context).textTheme.headline4;
    return Card(
      color: Colors.white,
      child: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Icon(choice.icon, size: 128.0, color: textStyle.color),
            Text(choice.title, style: textStyle),
          ],
        ),
      ),
    );
  }
}

任何帮助将不胜感激!

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    对于任何对此感到困惑并正在寻找答案的人,只需将您的 ListTile 包装在一个

    Visibility (
        visible: _visible
        child: ListTile(...)
    );
    

    只要你想删除,只需

    setState(() {
        _visible = false;
    });
    

    或者你想展示的时候

    setState(() {
        _visible = true;
    });
    

    【讨论】:

      猜你喜欢
      • 2021-06-08
      • 1970-01-01
      • 2012-10-26
      • 2011-11-11
      • 2014-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多