【问题标题】:FLUTTER Checkbox UI not updating颤振复选框 UI 未更新
【发布时间】:2020-07-27 09:03:04
【问题描述】:

我有很多复选框,你可以看到上传的图片,请先看图片。

现在的问题是您可以看到 3 张卡片视图条件、过敏和过去的手术。所有这些卡片都包含复选框,现在发生的情况是,当我选中或取消选中任何框时,CheckBox 的 UI 不会更新为勾选或取消勾选,并且我在构建方法之外有复选框。

谁能告诉我我做错了什么,我也会分享复选框代码吗?

编辑

动态创建复选框

List<Widget> _dynamicListWidget(List<dynamic> list) {

 List<Widget> widgetList = List<Widget>();
 for (var i = 0; i < list.length; i++) {
  Condition condition = list[i];
  widgetList.add(
    Container(
      width: _containerWidth,
      //padding: EdgeInsets.only(top: 2, bottom: 2),
      child: Row(
        children: <Widget>[
          Expanded(
              child: Container(
            margin: EdgeInsets.only(left: 10),
            child: Text(condition.name, style: _textStyle),
          )),
          //Expanded(child: Container()),
          Checkbox(
            value: condition.selected,
            onChanged: (bool value) {
              print("$value  value");
              setState(() {
                condition.selected = value;
              });
              addRemoveFavHealth(value, condition.id);
            },
          ),
        ],
      ),
    ),
  );
}
return widgetList;

}

创建卡片视图

 Widget mainbody(String name, List<dynamic> dynamicList) {
final screenWidth = MediaQuery.of(context).size.width;
final screenheight = MediaQuery.of(context).size.height;
print("$screenWidth width of device");
List<Condition> list = List();

return Container(
  width: screenWidth * 0.49,
  child: Card(
    color: Colors.white,
    child: Column(
      children: <Widget>[
        Container(
          //width: 200,
          padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8),
          decoration: BoxDecoration(
            color: Colors.black12,
          ),
          child: Row(
            children: <Widget>[
              ClipOval(
                child: Material(
                  color: Colors.white,
                  child: SizedBox(
                    width: 40,
                    height: 40,
                    child:
                        /*Image.asset(
                                        'assets/icons/doc_icon.png'),*/
                        Icon(
                      Icons.playlist_add_check,
                      color: AppTheme.primaryColor,
                    ),
                  ),
                ),
              ),
              Flexible(
                child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      Text(
                        _localization.localeString(name),
                        style: TextStyle(color: AppTheme.primaryColor),
                      ),
                    ],
                  ),
                ),
              ),
            ],
          ),
        ),
        Container(
          child: Column(
            children: _dynamicListWidget(list),
          ),
        ),
      ],
    ),
  ),
);

}

构建方法

@override
Widget build(BuildContext context) {
  _localization = AppTranslations.of(context);

  return Expanded(
    child: SingleChildScrollView(
      child: Column(
        children: _mainList,
      ),
    ) 
  );
}

在build方法中,_mainList是MAINBODY METHOD的列表。

【问题讨论】:

  • “发生的情况是,当我选中或取消选中任何框时,CheckBox 的 UI 不会更新为选中或取消选中,并且我在构建方法之外有复选框。”你是什​​么意思你在构建方法之外有复选框?看来您可能需要与我们分享更多代码以及“条件”变量是什么。
  • @JoãoSoares 我的意思是,条件是您可以看到许多复选框并且带有勾选和取消勾选,所以当我取消勾选带有已勾选框的框时会发生什么,它不会改变取消勾选,它仍然勾选,反之亦然......对于构建方法,我将添加更多代码以让您理解。
  • 您遇到这个问题是因为您在CheckBox 内的onChanged 属性中犯了一些错误(您提供的条件在某种程度上是错误的)。所以请添加更多代码,以便我们为您提供帮助
  • 当您按下任何复选框时,您必须在终端中收到一些消息,您可以添加吗?
  • @HardikKumar 我在终端中没有收到任何消息,因为您可以看到 onChange 中有一个打印命令,如果最初为 false,则它会打印该值的 true 并且不会更改复选框的用户界面,当我再次按下同一个复选框时,它会打印相同的真实值,因此这意味着复选框没有更新自身或值没有改变

标签: flutter checkbox flutter-layout


【解决方案1】:

您的问题是您在 for loop 内分配“条件”值,然后期望当您执行 setState 更改它时,它将反映在原始条件列表中。在这里,我有一个使用ListView.builder 而不是for loop 与列的示例以产生相同的效果,但正确地更改了外部列表中变量的值并且您的方法并行:

See the code running here on DartPad

class CheckBox63112014 extends StatefulWidget {
  @override
  _CheckBox63112014State createState() => _CheckBox63112014State();
}

class _CheckBox63112014State extends State<CheckBox63112014> {
  List checks = [
    true,
    false,
    false,
    true,
    false,
  ];

  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceAround,
      children: [
        Column(
          children: <Widget>[
            Text('ListView.builder'),
            buildList(checks),
          ],
        ),
        Column(
          children: <Widget>[
            Text('For loop'),
            Container(
              height: 400,
              width: 100,
              child: ListView(
                children: badList(checks),
              ),
            ),
          ],
        ),
      ],
    );
  }

  Widget buildList(List checks){
    return Container(
      height: 400,
      width: 100,
      child: ListView.builder(
        shrinkWrap: true,
        itemCount: checks.length,
        itemBuilder: (context, index) {
          return Checkbox(value: checks[index],
            onChanged: (value) {
              print('ListView $index $value');
              setState(() {
                checks[index] = !checks[index];
              });
            },
          );
        },
      ),
    );
  }

  List<Widget> badList(checks){
    List<Widget> widgetList = List<Widget>();
    for (var i = 0; i < checks.length; i++) {
      bool check = checks[i];
      widgetList.add(
        Checkbox(value: check,
          onChanged: (value) {
            print('For Loop $i $value');
            setState(() {
              check = value;
            });
          },
        )
      );
    }

    return widgetList;
  }
}

如果您将其更改为以下代码,您的代码应该可以工作:

Widget _dynamicListWidget(List<dynamic> list) {
  return ListView.builder(
    physics: NeverScrollableScrollPhysics(),
    itemCount: list.length,
    itemBuilder: (context, index) {
      return Container(
        width: _containerWidth,
        //padding: EdgeInsets.only(top: 2, bottom: 2),
        child: Row(
          children: <Widget>[
            Expanded(
              child: Container(
                margin: EdgeInsets.only(left: 10),
                child: Text(list[index].name, style: _textStyle),
              )),
            //Expanded(child: Container()),
            Checkbox(
              value: list[index].selected,
              onChanged: (bool value) {
                print("$value  value");
                setState(() {
                  list[index].selected = value;
                });
                addRemoveFavHealth(value, list[index].id);
              },
            ),
          ],
        ),
      );
    },
  );
}

这将要求您在使用“_dynamicListWidget”的地方需要期待 Widget 而不是 List&lt;Widget&gt;

【讨论】:

  • 我已经在我的应用程序中实现了这段代码,但仍然无法正常工作,但您提供的飞镖垫在那里工作
  • 我无法测试修改后的代码版本。我没有太多的数据。您面临的问题是什么?
  • 我在点击复选框时遇到了同样的问题
  • 您是否理解我的解释以及代码示例中显示的差异?
  • @AnasReza 你能回答我上面的问题吗?这样我就可以尽力帮助你了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 2021-12-11
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2021-11-19
  • 2020-04-19
相关资源
最近更新 更多