簡體   English   中英

使用 ListTile 在 flutter 中選中復選框時,如何在其他文本字段中顯示文本字段值

[英]How to display a textfield value in other textfield when checkbox is checked in flutter using ListTile

我創建了一個名為chargesMax的文本字段,並添加了一個ListTile小部件,其中包含復選框和兩個名為chargestime的文本字段。 我希望用戶在chargesMax文本字段上輸入一些值,然后選中任何checkbox ,然后charges文本字段應該包含chargesMax 文本字段的值。 然后如果用戶修改然后對文本字段收費,那么只有這個字段會修改不是listTile的所有文本字段。

這是我的代碼

charges.text = chargesMax.text;

在上面的這一行中,我正在嘗試做我想做的事情,但是當我選中任何 listTile 的復選框時,chargesMax 的值會顯示為收費文本字段,但復選框的所有文本字段都會在選中任何復選框時進行修改。 然而,我可以單獨檢查復選框。

完整代碼:


void _onCitySelected(bool selected, cityId) {
    if (selected == true) {
      setState(() {
        charges.text = chargesMax.text;  
        _selectedCities.add(cityId);
        print(_selectedCities);
      });
    } else {
      setState(() {
        _selectedCities.remove(cityId);
      });
    }
  }
Widget build(BuildContext context) {
    return SafeArea(
        child: Container(
        child: Column(
              children: [
                    //chargesMax textfield
                    textformfieldCustomwithouticon(
                    context,
                    TextInputType.number,
                    MediaQuery.of(context).size.width * 0.9,
                    chargesMax, (String value) {
                  setState(() {
                    chargesMax.text = value;

                    chargesMax.selection = TextSelection.fromPosition(
                        TextPosition(offset: chargesMax.text.length));
                  });
                }, (value) {
                  if (value == null || value.isEmpty) {
                    return 'Please enter some text';
                  }
                  return null;
                }, 'Enter delivery charges for maximumn destination',
                    'Delivery charges', 55.0),
                
                   SizedBox(
                                height:
                                    MediaQuery.of(context).size.height * 0.6,
                                child: ListView.builder(
                                    itemCount: books.length,
                                    itemBuilder: (context, index) {
                                      final book = books[index];
                                      if (isLoading) {
                                        return showCircularLoader(context);
                                      } else {
                                        return Padding(
                                          padding: const EdgeInsets.fromLTRB(
                                              0, 10, 0, 0),
                                          child: Column(
                                            children: [
                                              buildCitesList(book),
                                              SizedBox10(),
                                              Divider(),
                                              SizedBox10()
                                            ],
                                          ),
                                        );

                                        //
                                      }
                                    }),
                              ),


Widget buildCitesList(Book book) => ListTile(
        leading: checkboxCustom(context, _selectedCities.contains(book.id),
            (bool? selected) {
          if (selected != null) {
            setState(() {
              _onCitySelected(selected, book.id);
            });
          }
        }),
        title: Text(book.title, style: GoogleFonts.montserrat()),
        subtitle: Padding(
          padding: const EdgeInsets.only(top: 10),
          child: Row(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
             
              //charges textfield
              textformfieldCustomwithouticon1(
                  context,
                  TextInputType.number,
                  MediaQuery.of(context).size.width * 0.3,
                  charges, (String value) {
                setState(() {
                  charges.text = value;
                  charges.selection = TextSelection.fromPosition(
                      TextPosition(offset: charges.text.length));
                });
              }, (value) {
                if (value == null || value.isEmpty) {
                  return 'Please enter some text';
                }
                return null;
              }, 'Charges', 'Charges', 10.0),
              SizedBox(
                width: 10,
              ),
              textformfieldCustomwithouticon1(
                  context,
                  TextInputType.number,
                  MediaQuery.of(context).size.width * 0.3,
                  time, (String value) {
                setState(() {
                  time.text = value;
                  time.selection = TextSelection.fromPosition(
                      TextPosition(offset: time.text.length));
                });
              }, (value) {
                if (value == null || value.isEmpty) {
                  return 'Please enter some text';
                }
                return null;
              }, 'Time', 'Time', 10.0),
              // SizedBox10(),
            ],
          ),
        ),
      );

這是 output 的快照

在此處輸入圖像描述

請幫助我如何做到這一點。

.addListener上的chargesMaxController用於chargesMax

這是您想要的 output 的簡化版本。


class TimeToCode extends StatefulWidget {
  TimeToCode({Key? key}) : super(key: key);

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

class _TimeToCodeState extends State<TimeToCode> {
  TextEditingController chargesMaxController = TextEditingController();

  TextEditingController controller1 = TextEditingController();
  TextEditingController controller2 = TextEditingController();

  bool tile1CheckBox = false;
  bool tile2CheckBox = false;

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

    chargesMaxController.addListener(() {
      if (tile1CheckBox) {
        setState(() {
          controller1.text = chargesMaxController.text;
        });
      }
      if (tile2CheckBox) {
        setState(() {
          controller2.text = chargesMaxController.text;
        });
      }
    });
  }
 @override
  void dispose() {
    chargesMaxController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Text("chargesMax "),
          TextField(
            controller: chargesMaxController,
          ),
          ListTile(
            leading: Checkbox(
              value: tile1CheckBox,
              onChanged: (value) {
                setState(() {
                  tile1CheckBox = value!;
                });
                if (value!) {
                  setState(() {
                    controller1.text = chargesMaxController
                        .text; // handle Ui update on checkedBOx value changes
                  });
                }
              },
            ),
            title: TextField(
              controller: controller1,
            ),
          ),
          ListTile(
            leading: Checkbox(
              value: tile2CheckBox,
              onChanged: (value) {
                setState(() {
                  tile2CheckBox = value!;
                });
                if (value!) {
                  setState(() {
                    controller2.text = chargesMaxController
                        .text; // handle Ui update on checkedBOx value changes
                  });
                }
              },
            ),
            title: TextField(
              controller: controller2,
            ),
          )
        ],
      ),
    );
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM