当前位置: 首页 > 知识库问答 >
问题:

Flutter:按下BottomNavBar时如何更改FloatingactionButton图标?

胡俊美
2023-03-14

我试图在单击时更改底部导航栏中FloatingActionButton()的图标。它工作得很好,但只有当我离开屏幕回来的时候?有人知道出什么事了吗?调用changeIcon()中的Setstate应该强制重新呈现,还是我错了?

我真的很感激你的帮助:)

     return FloatingActionButton(
            child: this.pressed ? Icon(Icons.people) : Icon(Icons.close),
            onPressed: () {
              changeIcon();
            }); 
class HomeState extends State<Home> {
  MapRadials buttonProvider;
  Icon fabIcon = Icon(Icons.perm_media);
  FloatingActionButton floatingActionButton;
  int _currentIndex = 0;
  List<Widget> _screens = [
    FeedScreen(),
    MapScreen(),
    MapScreen(),
    NotificationScreen(),
    ChatScreen(),
  ];

  @override
  void initState() {
    super.initState();
    floatingActionButton = FloatingActionButton(
      onPressed: () {},
      child: fabIcon,
    );
  }

  void changeIcon(Icon icon) {
    setState(() {
      fabIcon = icon;
    });
  }

  @override
  Widget build(BuildContext context) {
    final MapRadials radialProvider = Provider.of<MapRadials>(context);
    this.buttonProvider = radialProvider;

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        leading: IconButton(
          icon: Icon(
            Icons.menu,
            size: 30.0,
            color: Colors.black,
          ),
          onPressed: () {},
        ),
        actions: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              Row(
                children: <Widget>[
                  IconButton(
                    icon: Icon(
                      Icons.filter_list,
                      size: 30.0,
                      color: Colors.black,
                    ),
                    onPressed: () {},
                  ),
                  IconButton(
                    icon: Icon(
                      Icons.search,
                      size: 30.0,
                      color: Colors.black,
                    ),
                    onPressed: () {},
                  ),
                ],
              )
            ],
          )
        ],
      ),
      bottomNavigationBar: bottomNavBar(),
      floatingActionButton: this.floatingActionButton,
      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
      body: _screens[_currentIndex],
    );
  }

  void onTabTapped(int index) {
    setState(() {
      if (index != 2) {
        _currentIndex = index;
        floatingActionButton = getFloatingActionButton(index);
      }
    });
  }

  Widget getFloatingActionButton(int index) {
    switch (index) {
      case 0: // Home
        return FloatingActionButton(child: Icon(Icons.add), onPressed: () {});
      case 1: // Map
        return FloatingActionButton(
            child: fabIcon,
            onPressed: () {
              changeIcon(Icon(Icons.save));
            });
      case 2: // Notification
        return FloatingActionButton(
            child: Icon(Icons.clear_all), onPressed: () {});
      case 3: // Chat
        return FloatingActionButton(
            child: Icon(Icons.add_comment), onPressed: () {});
      default:
        return FloatingActionButton(child: Icon(Icons.add), onPressed: () {});
    }
  }

  Widget bottomNavBar() {
    return BottomNavigationBar(
      type: BottomNavigationBarType.fixed,
      onTap: onTabTapped,
      currentIndex: _currentIndex,
      showSelectedLabels: false,
      showUnselectedLabels: false,
      items: [
        BottomNavigationBarItem(
          icon: Icon(
            Icons.home,
            color: Colors.black,
          ),
          title: Text('Feed'),
        ),
        BottomNavigationBarItem(
            icon: Icon(
              Icons.person_pin_circle,
              color: Colors.black,
            ),
            title: Text('Map')),
        BottomNavigationBarItem(
            icon: Icon(
              null,
            ),
            title: Text('Placeholder')),
        BottomNavigationBarItem(
          icon: Icon(
            Icons.notifications,
            color: Colors.black,
          ),
          title: Text('Noftications'),
        ),
        BottomNavigationBarItem(
            icon: Icon(
              Icons.chat_bubble,
              color: Colors.black,
            ),
            title: Text('Chat'))
      ],
    );
  }
}

共有1个答案

侯涵煦
2023-03-14

您正在更改状态中的图标,并对其使用setstate(),这很好,但是请注意,setstate()正在用scaffold重新构建小部件树,其floatingActionButton参数为floatingActionButton:this.floatingActionButton,并且在initstate()方法中设置this.floatingActionButton,该方法只调用一因为this.floatingActionButton只使用初始图标实例化一次,所以由setstate()触发的重建不会使用新图标呈现FAB。

尝试在didchangeDependencies()中设置this.floatingActionButton而不是initstate(),因为根据关于didChangeDependecies的flutter.dev文档文章,它将是

当此状态对象的依赖项更改时调用。

 类似资料:
  • 我正在尝试使用Flutter中的进度状态按钮。在pub.dev文档中,小部件的设置如下

  • 问题内容: 我正在用Java开发游戏,面临以下挑战。 我有2个,需要在视觉上将形状从一个拖动到另一个。我有使用这个工作从。当我按下鼠标拖动形状时,激活该形状并将其转移到glassPane。因此,您需要将状态从转移到。我通过使用Robot类解决了这个问题,该类模拟了glassPane被激活后的另一个事件。 现在出现了问题,此解决方法仅在Windows上有效,而不适用于mac osx,在osx上,只要

  • } 完整错误消息:

  • 我执行了Flutter Launcher图标程序,它工作得很好,所有应用程序图标都改变了,在下面文件夹中的图像被我的图标改变后: mipmap-hdpi mipmap-mdpi mpmap-xhdpi mipmap xxhdpi mpmap-xxxhdpi 然而,有一个图标没有被更改,我不知道如何更改。 在这张图片下面,仍然是颤动图标。 图标Flutter演示 这个图标应该已经改变了,因为其他所有

  • 我试图为一个使用蓝牙进行通信的应用程序启动一个flutter项目。为此,我使用了flutter blue。 不幸的是,当尝试(在Android设备上)运行我创建的第一个示例时,遇到了以下错误: 如果我在Android Studio上,我会知道如何升级Android minSdkVersion,但在一个扑朔迷离的项目(使用VSCode)上,我有点迷失了。 是否有可能用颤振来增加最小Sdk版本,以及如

  • 我有一个子类JPanel的PointPanel,我想在其中实现以下行为:如果鼠标悬停在实例上,按下shift键,鼠标光标变为手光标;如果松开shift键,鼠标光标将变回默认光标。 为了实现这一点,我尝试在构造函数中添加一个: 这种方法不起作用。 包含此面板的窗口应该具有焦点,因为它是应用程序的唯一可见窗口。 我错过了什么?