循环中的 RadioListTile Flutter

Posted

技术标签:

【中文标题】循环中的 RadioListTile Flutter【英文标题】:RadioListTile Flutter in loop 【发布时间】:2021-03-08 13:32:08 【问题描述】:

RadioListTile 有问题,它不起作用

我正在尝试创建 RadioListTile 列表,以使用 for 循环填充来自 firebase 的数据。当我点击它时,它会收到动作,但点击它时我无法选中该框。

我已经尝试解决它好几天了。有人可以帮忙吗?

这是我的代码:

import 'package:eatwell/src/helpers/changescreen.dart';
import 'package:eatwell/src/model/itemmodel.dart';
import 'package:eatwell/src/model/platemodel.dart';
import 'package:eatwell/src/pages/cartPage.dart';
import 'package:eatwell/src/provider/customplate.dart';
import 'package:eatwell/src/provider/item.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class CustomDetail extends StatefulWidget 
  final CustomModel custom;

  const CustomDetail(Key key, this.custom) : super(key: key);

  @override
  _CustomDetail createState() => _CustomDetail();


class _CustomDetail extends State<CustomDetail> 
  @override
  Widget build(BuildContext context) 
    final carbsProvider = Provider.of<CarbsProvider>(context);
    var mycarb = 1;
    return Scaffold(
        appBar: AppBar(
          title: Text(
            "Preset Meal",
            style: TextStyle(
              fontSize: 30.0,
              fontWeight: FontWeight.bold,
              color: Colors.black,
              fontFamily: 'DancingScript',
            ),
          ),
          centerTitle: true,
          actions: <Widget>[
            Padding(
              padding: const EdgeInsets.only(bottom: 8.0, right: 8.0),
              child: Stack(
                children: <Widget>[
                  IconButton(
                      icon: Icon(
                        Icons.shopping_bag_outlined,
                        size: 40,
                      ),
                      onPressed: () 
                        changeScreen(context, Cart());
                      ),
                  Positioned(
                    right: 3,
                    bottom: 0,
                    child: Container(
                      decoration: BoxDecoration(
                          color: Colors.white,
                          borderRadius: BorderRadius.circular(10),
                          boxShadow: [
                            BoxShadow(
                                color: Colors.grey,
                                offset: Offset(2, 3),
                                blurRadius: 3)
                          ]),
                      child: Padding(
                        padding: const EdgeInsets.only(left: 4, right: 4),
                        child: Text(
                          "2",
                          style: TextStyle(
                              color: Colors.red,
                              fontSize: 16.0,
                              fontWeight: FontWeight.bold),
                        ),
                      ),
                    ),
                  )
                ],
              ),
            )
          ],
        ),
        body: SafeArea(
          child: ListView(
            children: <Widget>[
              Padding(
                padding: const EdgeInsets.only(
                    left: 20.0, right: 20, bottom: 10, top: 30),
                child: Container(
                  decoration: BoxDecoration(
                    color: Colors.cyanAccent,
                    borderRadius: BorderRadius.circular(100),
                  ),
                  height: 300,
                  alignment: Alignment.center,
                  child: Image(
                    image: NetworkImage(widget.custom.image),
                    height: 300,
                    width: 300,
                  ),
                ),
              ),
              Text(
                widget.custom.name,
                style: TextStyle(fontSize: 30.0, fontWeight: FontWeight.bold),
                textAlign: TextAlign.center,
              ),
              Text(
                ("RM $widget.custom.price"),
                style: TextStyle(fontSize: 30.0, fontWeight: FontWeight.bold),
                textAlign: TextAlign.center,
              ),

              for (var i = 0; i < widget.custom.carbnum; i++)
                Column(
                  children: <Widget>[
                    ListTile(
                      title: Text("Choose Your Carbohydrates"),
                    ),
                    for (var i = 0; i < carbsProvider.carbs.length; i++)
                      RadioListTile(
                        title: Text(carbsProvider.carbs[i].name),
                        value: i,
                        onChanged: (var v) 
                          print("object");
                          mycarb = v;
                        ,
                        groupValue: mycarb,
                      )
                  ],
                ),

              // for (var i = 0; i < widget.custom.fooditems.length; i++)
              //   Text(
              //     widget.custom.fooditems[i],
              //     style: TextStyle(fontSize: 30.0, fontWeight: FontWeight.bold),
              //   )
            ],
          ),
        ));
  

【问题讨论】:

您的列表中是否填满了 Firestore 数据,而问题出在您单击列表时?你有任何错误日志吗? 我的 RadioTile 列表充满了来自 firestore 的数据,但我不知道如何设置 radiotilelist 的 groupvalue,因为当我点击收音机列表的 n 项数据时,它将标记为选中 我已经解决了,变量应该在构建内容之外声明,谢谢大家的帮助 【参考方案1】:

将您的 onChanged 包装在 setState 中。 就像

onChanged: (var v) 
  setState(()
    print("object");
    mycarb = v;
  );
,

【讨论】:

我已经解决了,变量应该在构建内容之外声明,谢谢大家的帮助【参考方案2】:

根据文档:

调用 setState 会通知框架此对象的内部状态已发生更改,可能会影响此子树中的用户界面,这会导致框架为此 State 对象安排构建。

在 RadioListTile 小部件的 onChanged 方法中使用 setState 方法,并由 Abdul Qadir 回答。

【讨论】:

我已经解决了,变量应该在构建内容之外声明,谢谢大家的帮助

以上是关于循环中的 RadioListTile Flutter的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ListView.builder 中使用 RadioListTile?

flutte页面布局四

flutte学习-裁剪圆角图片

Flutter 中的表单

flutte学习-编译模式

flutte学习-编译模式