我有一个浮动按钮,我想根据从外部类接收的图标来动态更改图标.

这里: child: Icon(widget.icon, size: 50, color: themeProvider.titleColor)

class TaskButton extends StatefulWidget {
  final IconData? icon;
  const TaskButton({super.key, this.icon});

  @override
  State<TaskButton> createState() => _TaskButtonState();
}

class _TaskButtonState extends State<TaskButton> {
  @override
  Widget build(BuildContext context) {
    var themeProvider = Provider.of<ThemeProvider>(context);
    return Positioned(
        bottom: 16.0,
        right: 16.0,
        width: 80,
        height: 80,
        child: Builder(
          builder: (context) => FloatingActionButton(
            onPressed: () {
              [...]
            },
            backgroundColor: themeProvider.selectedColor,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(40.0),
            ),
            child: Icon(widget.icon, size: 50, color: themeProvider.titleColor),
          ),
        ));
  }
}

然后,在外部类中,我try 通过告诉TaskButton一个图标来构造TaskButton,该图标会根据tabController的当前索引进行更改.

这里: TaskButton(icon: getIconForTab(_tabController.index))

class MainHome extends StatefulWidget {
  const MainHome({super.key});

  @override
  State<MainHome> createState() => _MainHomeState();
}

class _MainHomeState extends State<MainHome>
    with SingleTickerProviderStateMixin {
  late TabController _tabController;

  @override
  void initState() {
    super.initState();
    _tabController = TabController(length: 3, vsync: this);
  }

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    var themeProvider = Provider.of<ThemeProvider>(context);
    return Scaffold(
        [...]
          bottom: TabBar(
              controller: _tabController,
              unselectedLabelColor: Colors.grey,
              labelColor: themeProvider.selectedColor,
              dividerColor: Colors.transparent,
              indicatorSize: TabBarIndicatorSize.tab,
              tabs: const [
                Tab(icon: Icon(Icons.task_alt_rounded)),
                Tab(icon: Icon(Icons.alarm_add_rounded)),
                Tab(icon: Icon(Icons.edit_document)),
              ]),
        ),
        body: Stack(
          children: [
            TabBarView(
              controller: _tabController,
              children: const [
                GoalsTab(),
                AlarmsTab(),
                CheckTab(),
              ],
            ),
            TaskButton(
              icon: getIconForTab(_tabController.index),
            ),
          ],
        ));
  }
}

IconData getIconForTab(int index) {
  switch (index) {
    case 0:
      return Icons.add;
    case 1:
      return Icons.alarm_add_rounded;
    case 2:
      return Icons.edit_document;
    default:
      return Icons.add;
  }
}

我try 过处理状态,但我无法让TaskButton在每次收到图标时重新生成.

图标总是固定的,在构造过程中收到的第一个图标,所以当我从一个选项卡滑动到另一个选项卡进行 Select 或更改时,TaskButton图标保持固定.

class _TaskButtonState extends State<TaskButton> {
  late IconData? currentIcon;

  @override
  void initState() {
    super.initState();
    currentIcon = widget.icon;
  }

  @override
  void didUpdateWidget(covariant TaskButton oldWidget) {
    super.didUpdateWidget(oldWidget);
    if (widget.icon != oldWidget.icon) {
      setState(() {
        currentIcon = widget.icon;
      });
    }
  }

  [...]

  child: Icon(currentIcon, size: 50, color: themeProvider.titleColor)

谢谢提前如果有人可以帮助我.

推荐答案

在_MainHomeState中,您应该使用setState(或其他状态管理工具)进行重建:

    class _MainHomeState extends State<MainHome>
        with SingleTickerProviderStateMixin {
      late TabController _tabController;
    
      int _selectedIndex = 0;
    
      @override
      void initState() {
        super.initState();
        _tabController = TabController(length: 3, vsync: this);
        _tabController.addListener(() {
          if (_tabController.indexIsChanging) {
            print(
                "tab is animating. from active (getting the index) to inactive(getting the index) ");
          } else {
            setState(() {
              _selectedIndex = _tabController.index;
            });
          }
        });
      }
    
      @override
      void dispose() {
        _tabController.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          ....
                  Icon(getIconForTab(_selectedIndex)),
          ....
      }
    
    IconData getIconForTab(int index) => switch (index) {
          0 => Icons.add,
          1 => Icons.alarm_add_rounded,
          2 => Icons.edit_document,
          _ => Icons.add
        };
}

另外,你应该看起来像here

Flutter相关问答推荐

类型flatter doctor get zsh:未找到命令:macO中flatter

Flutter 对齐:不适用于多行文字

如何在Ffltter Chrome应用程序中使用webview_fltter_web显示自定义html而不是外部uri?

如何在Flutter 中不从getX库中初始化GetxController中的变量

在Flutter 中实现中小型应用程序栏标题

火焰Flutter 在多个向量之间插补2

带有附加图像的ListTile

Flutter中有没有办法区分鼠标左右平移?

如何在Flutter 中使用选定的键和值从 map 列表创建 map

Flutter 中的区域不匹配

Freezed+BLoc 如何从 BLoc Listener 查看当前状态和特定状态的变量

这是使用导航功能处理从一页到另一页的移动的最佳方式

如何在 flutter 中使用 tabbar 作为底部导航栏?

在 Flutter 中使用 HardwareKeyboard 时所有键都没有响应

在 flutter 的另一个类中使用变量值

如何在 Flutter 中使用简写 IF 禁用单选按钮?

在 flutter 中使用 StreamBuilder 在文本字段中键入时显示过滤记录

主题:ThemeData() Flutter

Flutter:滚动一个ListWheelScrollView,无法获取选中项的状态

检索 api 的值时,我得到_TypeError(类型'Null'不是'String'类型的子类型)