Flutter 如何使按钮选中所有颤振复选框?

Flutter 如何使按钮选中所有颤振复选框?,flutter,flutter-layout,Flutter,Flutter Layout,问题是我无法让按钮选择所有复选框,因为我使用的是自动生成的复选框列表 由于我创建了一个带有列表项WordBlock的类,它是一个带有复选框的容器,每个复选框都有自己的选中值,因此我不能以任何方式选择所有内容。如果我通过构造函数设置checked值,那么它会选择所有内容,但是onChanged()方法不起作用,一个复选框的值也不会改变。但是您需要能够一次选中一个复选框或一次选中所有复选框,使用按钮选择所有复选框 下面是列表中显示的我的WordBlock类的代码 class WordBlock ex

问题是我无法让按钮选择所有复选框,因为我使用的是自动生成的复选框列表

由于我创建了一个带有列表项WordBlock的类,它是一个带有复选框的容器,每个复选框都有自己的选中值,因此我不能以任何方式选择所有内容。如果我通过构造函数设置checked值,那么它会选择所有内容,但是onChanged()方法不起作用,一个复选框的值也不会改变。但是您需要能够一次选中一个复选框或一次选中所有复选框,使用按钮选择所有复选框

下面是列表中显示的我的WordBlock类的代码

class WordBlock extends StatefulWidget {

  final bool checkAll;
  WordBlock(this.checkAll);
  @override
  _WordBlockState createState() => _WordBlockState();
}

class _WordBlockState extends State<WordBlock> {
  FlutterTts tts = FlutterTts();
  bool checked = false;
  Future _speak(String text) async {
    await tts.setLanguage('en-US');
    await tts.speak(text);
  }

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.symmetric(horizontal: 35.w),
      child: Card(
        color: checked ? MyColors().scaffoldBG : Colors.white,
        elevation: 4.0,
        shadowColor: MyColors().black.withOpacity(0.1),
        shape:
            RoundedRectangleBorder(borderRadius: BorderRadius.circular(25.ssp)),
        child: CheckboxListTile(
          value: checked,
          activeColor: MyColors().purple,
          onChanged: (value) {
            print('changed');
            setState(() {
              checked = value;
            });
          },
          title: h2(text: 'Car'),
          secondary: Padding(
            padding: EdgeInsets.only(top: 10.h),
            child: InkWell(
              onTap: () => _speak('Car'),
              child: Icon(
                Icons.volume_up_rounded,
                color: MyColors().purple,
                size: 60.ssp,
              ),
            ),
          ),
          subtitle: Text(
            'Машина',
            style: TextStyle(color: Color(0xFFB8A98BA), fontSize: 27.ssp),
          ),
        ),
      ),
    );
  }
}
类字块扩展StatefulWidget{
最终布尔检查全部;
字块(this.checkAll);
@凌驾
_WordBlockState createState()=>\u WordBlockState();
}
类_WordBlockState扩展状态{
颤振tts tts=颤振tts();
bool checked=false;
Future\u speak(字符串文本)异步{
等待tts.setLanguage(“en-US”);
等待tts.speak(文本);
}
@凌驾
void initState(){
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回填充(
填充:边缘组。对称(水平:35.w),
孩子:卡片(
颜色:选中?MyColors().scaffoldBG:Colors.white,
标高:4.0,
阴影颜色:MyColors().黑色,不透明度(0.1),
形状:
RoundedRectangleBorder(borderRadius:borderRadius.circular(25.ssp)),
子:CheckboxListTile(
值:选中,
activeColor:MyColors().紫色,
一旦更改:(值){
打印(“更改”);
设置状态(){
选中=值;
});
},
标题:h2(文本:“汽车”),
第二:填充(
填充:仅限边缘设置(顶部:10.h),
孩子:InkWell(
onTap:()=>(你说"车"),,
子:图标(
Icons.volume\u up\u四舍五入,
颜色:MyColors().紫色,
尺寸:60.ssp,
),
),
),
字幕:文本(
'Машина',
样式:TextStyle(颜色:color(0xFFB8A98BA),字体大小:27.ssp),
),
),
),
);
}
}
以下是显示WordBloc列表的“我的页面”的代码:

class WordPage extends StatefulWidget {
  @override
  _WordPageState createState() => _WordPageState();
}

class _WordPageState extends State<WordPage> {
  bool visible = true;
  double banerHeight;
  bool checked = false;

  @override
  void initState() {
    super.initState();
  }

  Widget _wrapWithBanner() {
    if (!visible) {
      setState(() {
        banerHeight = 0;
      });
    }
    return visible
        ? Container(
            margin: EdgeInsets.only(
                left: 35.w, right: 35.w, top: 30.h, bottom: 30.h),
            padding: EdgeInsets.symmetric(vertical: 25.h),
            decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(25.ssp),
                color: MyColors().scaffoldBG,
                boxShadow: [boxShadow4Y10Blur()]),
            child: ListTile(
              onTap: () {
                print('close');
              },
              trailing: visible
                  ? InkWell(
                      onTap: () {
                        print('tapped');
                        setState(() {
                          visible = false;
                        });
                      },
                      child: Icon(Icons.close))
                  : Container(),
              leading: CircleAvatar(),
              title: h3bold(text: 'Совет'),
              subtitle: Text(
                'Чтобы запомнить как можно больше слов, регулярно повторяйте их: каждые два-три часа :)',
                style: TextStyle(color: MyColors().black, fontSize: 27.ssp),
              ),
            ))
        : Container();
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
        child: Scaffold(
      backgroundColor: MyColors().white,
      appBar: AppBar(
        elevation: 2.0,
        title: h2(text: 'Работа'),
        iconTheme: IconThemeData(size: 20.ssp, color: MyColors().purple),
        backgroundColor: MyColors().white,
      ),
      body: Column(
        children: [
          _wrapWithBanner(),
          Row(
            children: [
              FlatButton( // my selectAll button
                  onPressed: () {},
                  child: Row(
                    children: [
                      Checkbox(
                          value: checked,
                          onChanged: (val) {
                            setState(() {
                              checked = val;
                            });
                          }),
                      Text(
                        'Выделить все',
                        style: TextStyle(
                            color: MyColors().purple, fontSize: 27.ssp),
                      )
                    ],
                  ))
            ],
          ),
          Expanded(
              child: ListView.builder(
            itemCount: 4,
            itemBuilder: (context, index) {
              return WordBlock(checked);
            },
          ))
        ],
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
      floatingActionButton: Container(
        width: 667.w,
        height: 91.h,
        child: FloatingActionButton(
          backgroundColor: MyColors().purple,
          onPressed: () {},
          shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(24.ssp)),
          child: h2reg(
              text: "Добавить в мой словарь", textColor: MyColors().white),
        ),
      ),
    ));
  }

}
类WordPage扩展StatefulWidget{
@凌驾
_WordPageState createState()=>\u WordPageState();
}
类WordPageState扩展了状态{
布尔可见=真;
双盲光;
bool checked=false;
@凌驾
void initState(){
super.initState();
}
Widget_wrapWithBanner(){
如果(!可见){
设置状态(){
白光=0;
});
}
返回可见
?容器(
页边距:仅限边距(
左:35.w,右:35.w,顶部:30.h,底部:30.h),
填充:边缘组。对称(垂直:25.h),
装饰:盒子装饰(
边界半径:边界半径。圆形(25.ssp),
颜色:MyColors().scaffoldBG,
boxShadow:[boxShadow4Y10Blur()]),
孩子:ListTile(
onTap:(){
打印(“关闭”);
},
尾随:可见
?墨水池(
onTap:(){
打印(‘点击’);
设置状态(){
可见=假;
});
},
子:图标(图标。关闭))
:Container(),
前导:CircleAvatar(),
标题:h3bold(文本:“ССччч”),
字幕:文本(
'Чтобы запомнить как можно больше слов, регулярно повторяйте их: каждые два-три часа :)',
样式:TextStyle(颜色:MyColors().black,fontSize:27.ssp),
),
))
:容器();
}
@凌驾
小部件构建(构建上下文){
返回安全区(
孩子:脚手架(
背景颜色:MyColors().白色,
appBar:appBar(
标高:2.0,
标题:h2(文本:“ааааааааааа”)中,
iconTheme:IconThemeData(大小:20.ssp,颜色:MyColors().purple),
背景颜色:MyColors().白色,
),
正文:专栏(
儿童:[
_wrapWithBanner(),
划船(
儿童:[
FlatButton(//我的selectAll按钮
按下:(){},
孩子:排(
儿童:[
复选框(
值:选中,
一旦更改:(val){
设置状态(){
选中=val;
});
}),
正文(
'Выделить все',
样式:TextStyle(
颜色:MyColors().紫色,字体大小:27.ssp),
)
],
))
],
),
扩大(
子项:ListView.builder(
物品计数:4,
itemBuilder:(上下文,索引){
返回字块(选中);
},
))
],
),
浮动ActionButtonLocation:浮动ActionButtonLocation.centerFloat,
浮动操作按钮:容器(
宽度:667.w,
高度:91,
子:浮动操作按钮(
背景颜色:MyColors().紫色,
按下:(){},
形状:圆形矩形边框(
边界半径:边界半径。圆形(24.ssp)),
儿童:h2reg(
文本:“ббббббббббббббббб,
),
),
));
}
}
class WordBlock extends StatefulWidget {

 bool checked = false;
  WordBlock();
  @override
  _WordBlockState createState() => _WordBlockState();
}

Checkbox(
          value: widget.checked,
          onChanged: (val) {
           setState(() {
           widget.checked = val;
           });
          }),