[英]How to display a textfield value in other textfield when checkbox is checked in flutter using ListTile
我創建了一個名為chargesMax
的文本字段,並添加了一個ListTile
小部件,其中包含復選框和兩個名為charges
和time
的文本字段。 我希望用戶在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.