【问题标题】:Checkbox with many options带有许多选项的复选框
【发布时间】:2020-05-03 15:00:20
【问题描述】:

我创建了两个复选框,但是在单击其中一个后,它们都被标记了,如下图所示,有人可以帮我解决这个问题吗?

只能标记一个,

我的代码:

class _LanguageSelectorState extends State<LanguageSelector> {
  static final List<String> languagesList = application.supportedLanguages;
  static final List<String> languageCodesList =
      application.supportedLanguagesCodes;


  final Map<dynamic, dynamic> languagesMap = {
    languagesList[0]: languageCodesList[0],
    languagesList[1]: languageCodesList[1],
  };

  @override
  Widget build(BuildContext context) {
    return Scaffold(
          backgroundColor: Colors.white,
          appBar: AppBar(
            backgroundColor: Colors.white,
            iconTheme: IconThemeData(color: Colors.black),
            title: Text(AppTranslations.of(context).text("settings_language"), style: TextStyle(color: Colors.black, letterSpacing: 1)),
            elevation: 0.0,
            centerTitle: true,
            bottom: PreferredSize(child: Container(color: Colors.black, height: 0.1), preferredSize: Size.fromHeight(0.1),),
          ),
      body: _buildLanguagesList()
    );
  }

  String selectedLanguage = '';

  _buildLanguagesList() {
    return ListView.builder(
      itemCount: languagesList.length,
      itemBuilder: (context, index) {
        return _buildLanguageItem(languagesList[index]);
      },
    );
  }

   bool _value = false;
  _buildLanguageItem(String language) {
    return CheckboxListTile(
      title: Text(language),
      value: _value,
      onChanged: (value) {
        setState(() {
          _value = value;
          application.onLocaleChanged(Locale(languagesMap[language]));
        });
      },
      controlAffinity: ListTileControlAffinity.trailing,
    );
  }
}

感谢您的帮助 :) ///////////////////////////////////////// /////////////////

【问题讨论】:

  • 似乎复选框在recyclerview中,所以你应该指定哪个项目的复选框被标记或未标记。

标签: android ios flutter dart checkbox


【解决方案1】:

看看这个例子。希望能回答你的问题如何在 listView 中使用复选框

List<Map<String, dynamic>> languagesList = [
  {'value': false},
  {'value': false}
];

  ListView.builder(
      itemCount: languagesList.length,
      itemBuilder: (context, index) {
        return CheckboxListTile(
          title: Text(languagesList[index]['value'].toString()),
          value: languagesList[index]['value'],
          onChanged: (value) {
            setState(() {
              languagesList[index]['value'] = value;
            });
          },
          controlAffinity: ListTileControlAffinity.trailing,
        );
      }),

您的方法不起作用的原因是因为您已为所有复选框分配了一个变量,因此您的复选框不会一起更新

【讨论】:

  • 这行不通,因为语言列表取自另一个来源,我编辑了我的主帖
  • @halohalohalo 我不知道你的来源是什么样的。你必须在这里提供明确的问题。向每个人提出问题时,请务必花时间了解清楚。最好的方法是创建一个易于重现的新简单示例。帮助我们帮助您
【解决方案2】:

由于ListView 创建的所有小部件都具有相同的值_value,因此如果选中其中一个小部件,则所有小部件的值都会更改,因为它们都依赖于同一个变量。

这是一个演示如何做到这一点。它可能包含错误。

import 'package:flutter/material.dart';

class LanguageItem extends StatefulWidget {

  Key key;
  bool isSelected = false;
  YOURCLASS application;
  String language;

  LanguageItem({@required language, @required this.application, this.key 
}):super(key:key);


  @override
  _LanguageItemState createState() => _LanguageItemState();
}

class _LanguageItemState extends State<LanguageItem> {


  @override
  Widget build(BuildContext context) {
    return CheckboxListTile(
      title: Text(widget.language),
      value: widget.isSelected,
      onChanged: (value) {
        setState(() {
          widget.isSelected = value;
          widget.application.onLocaleChanged(Locale(languagesMap[language]));
        });
      },
      controlAffinity: ListTileControlAffinity.trailing,
    );
  }
}

【讨论】:

  • @halohalohalo 您必须将其包装起来并制作一个小部件,以便每个小部件都有自己的变量
  • @halohalohalo 检查示例
  • @halohalohalo 你可以发挥创意。
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多