颤振消息“构建期间调用了 setState() 或 markNeedsBuild()”

问题描述 投票:0回答:1

我对以下代码有问题。我收到消息“在构建期间调用 setState() 或 markNeedsBuild()”,但我不知道该怎么做才能使代码正确运行。 这个想法是创建一个列表来存储激活的 ToggleButton 的索引,以便在不同位置的不同屏幕上生成相同信息的显示。 非常感谢您的帮助。

如果需要更多代码或信息,我很乐意发布。


class ToggleButtonUsers extends StatefulWidget {
  @override
  _ToggleButtonUsersState createState() => _ToggleButtonUsersState();
}

class _ToggleButtonUsersState extends State<ToggleButtonUsers> {
  bool vertical = false;
  List<bool> selectedUser = [];
  List<Widget> selectedChildren = [];

  @override
  void initState() {
    final userModelData = Provider.of<UserModel>(context, listen: false);
    final userModel = userModelData.items;
    final toggleModelData = Provider.of<ToggleProvider>(context, listen: false);
    final toggleModel = toggleModelData.items;
    final indexUserData = Provider.of<ToggleProvider>(context, listen: false);
    final indexUser = indexUserData.indexUser;
    for (var index = 0; index < toggleModel.length; index += 1) {
      debugPrint('aktueller Index: ' + index.toString());
      selectedUser = List.generate(
        toggleModel.length,
        (index) => index == 0 ? true : false,
      );
      toggleModelData.addIndex(0);
      selectedChildren = List.generate(
        toggleModel.length,
        (index) => UserItem(
          userModel[index].id,
          userModel[index].name,
          userModel[index].image,
          userModel[index].color,
        ),
      );
      //indexUserData.addIndex(0);
    }
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final indexUserData = Provider.of<ToggleProvider>(context);
    final indexUser = indexUserData.indexUser;
    debugPrint('Inhalt UserIndex ist: ' + indexUser.toString());
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: ToggleButtons(
        constraints: const BoxConstraints(
          minHeight: 40.0,
          maxHeight: 45,
          minWidth: 80.0,
          maxWidth: 85,
        ),
        borderRadius: BorderRadius.circular(30),
        fillColor: Colors.green,
        //disabledBorderColor: Colors.red,
        direction: vertical ? Axis.vertical : Axis.horizontal,
        onPressed: (int index) {
          if (mounted) {
            setState(() {
              selectedUser[index] = !selectedUser[index];
            });
          }
          selectedUser[index] == true
              ? indexUserData.addIndex(index)
              : indexUserData.removeIndex(10);
          debugPrint('selected User ist nun: ' + selectedUser.toString());
          debugPrint('der gecklickte Index ist: ' + index.toString());
        },
        children: selectedChildren,
        isSelected: selectedUser,
      ),
    );
  }
}
flutter dart build setstate
1个回答
0
投票

我猜发生这种情况是因为你调用了notifyListeners()或类似的东西来更新你的initState中的ui。这里的问题是 ui 仍在 initState 内构建...您可以尝试将

toggleModelData.addIndex(0);
) 包装在 addPostFrameCallback:

WidgetsBinding.instance.addPostFrameCallback((_){

  toggleModelData.addIndex(0);

});

这将在 Frame 渲染后调用它

© www.soinside.com 2019 - 2024. All rights reserved.