Флажок с множеством вариантов - PullRequest
0 голосов
/ 03 мая 2020

Я создал два флажка, но после нажатия на один из них оба помечены, как показано на рисунке ниже, может ли кто-нибудь помочь мне решить эту проблему?

может быть помечен только один,

enter image description here

мой код:

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,
    );
  }
}

спасибо за любую помощь :) ///////////////////// ////////////////////////////////////////////////// /

Ответы [ 3 ]

1 голос
/ 03 мая 2020

Посмотрите на этот пример. Надеюсь, что это ответит на ваш вопрос, как использовать флажки в 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,
        );
      }),

Причина, по которой ваш подход не сработал, заключается в том, что вы присвоили одну переменную всем своим флажки, так что не бродите ваши флажки были обновлены вместе

1 голос
/ 03 мая 2020

Это не лучший способ сделать это, потому что, когда у вас будет больше элементов, начнутся проблемы, но для двух элементов в списке что-то должно быть в порядке

  _buildLanguagesList() {
    return SingleChildScrollView(
      child: Column(
        children: <Widget>[
          CheckboxListTile(
            title: Text(languagesList[0]),
            value: _langOne,
            onChanged: (value) {
              setState(() {
                _langOne = value;
                if(_langOne){
                  _langTwo = false;
                }
                application.onLocaleChanged(Locale(languagesMap[languagesList[0]]));
              });
            },
          ),
          CheckboxListTile(
            title: Text(languagesList[1]),
            value: _langTwo,
            onChanged: (value) {
              setState(() {
                _langTwo = value;
                if(_langTwo){
                  _langOne = false;
                }
                application.onLocaleChanged(Locale(languagesMap[languagesList[1]]));
              });
            },
          )
        ],
      ),
    );
  }

   bool _langOne = false;
   bool _langTwo = false;
0 голосов
/ 03 мая 2020

Поскольку все виджеты, созданные с помощью 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,
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...