如何解决在 Flutter 中获取值 TextEditingController 错误
我想用循环从textEditingController中取值,listview不滚动时出现的问题会导致报错“RangeError (index): Invalid value: Not in inclusive range 0..23: 24 ",我有 40 条记录的随机数据, 滚动到行尾时,应用程序将正常运行。我希望即使我不向下滚动数据仍然可以无错误地检索。
你可以运行我的示例代码,请帮助我谢谢。
import 'dart:math';
import 'package:Flutter/material.dart';
class Karyawan {
int id;
String nama;
int jamKerja;
Karyawan({this.id,this.nama,});
Karyawan.fromJson(Map<String,dynamic> json) {
id = json['id'];
nama = json['nama_karyawan'];
jamKerja = json['jam_kerja'];
}
Map<String,dynamic> toJson() {
final Map<String,dynamic> data = new Map<String,dynamic>();
data['id'] = this.id;
data['nama_karyawan'] = this.nama;
data['jam_kerja'] = this.jamKerja;
return data;
}
}
List<Karyawan> _daftarKaryawan = List.generate(
40,(index) => Karyawan(
id: Random().nextInt(100),nama: 'test ${Random().nextInt(100)}',),);
class FormInputAbsenV3 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Entry Absen"),body: FormEntry(listKaryawan:_daftarKaryawan)
);
}
}
class FormEntry extends StatefulWidget {
final List<Karyawan> listKaryawan;
const FormEntry({Key key,this.listKaryawan}) : super(key: key);
@override
_FormEntryState createState() => _FormEntryState();
}
class _FormEntryState extends State<FormEntry> {
List karyawan = [];
final _formKey = GlobalKey<FormState>();
List<TextEditingController> _brutos = new List();
List<TextEditingController> _nettos = new List();
void addlistAbsen() {
for (int i = 0; i < widget.listKaryawan.length; i++) {
karyawan.add({
"id": widget.listKaryawan[i].id,"bruto": _brutos[i].text,"netto": _nettos[i].text
});
}
print(karyawan);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
margin: EdgeInsets.all(5.0),child: Form(
key: _formKey,child: Container(
child: ListView.builder(
itemCount: widget.listKaryawan.length,itemBuilder: (context,index) {
_brutos.add(new TextEditingController());
_nettos.add(new TextEditingController());
return Column(
children: [
FormWidget(
index: index,nama: widget.listKaryawan[index].nama,brucon: _brutos[index],netcon: _nettos[index],SizedBox(
height: 20.0,],);
},floatingActionButton: FloatingActionButton.extended(
icon: Icon(Icons.save),label: Text("Save"),onpressed: () {
if (_formKey.currentState.validate()) {
addlistAbsen();
}
},);
}
}
class FormWidget extends StatelessWidget {
final int index;
final String nama;
final brucon;
final netcon;
FormWidget({this.index,this.brucon,this.netcon});
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [
Expanded(
child: Text("${index + 1}. ${nama}"),Expanded(
child: TextFormField(
decoration: new Inputdecoration(
labelText: "Bruto",fillColor: Colors.white,border: new OutlineInputBorder(
borderRadius: new BorderRadius.circular(25.0),borderSide: new BorderSide(),style: new TextStyle(
fontFamily: "Poppins",controller: brucon,SizedBox(
width: 20.0,Expanded(
child: TextFormField(
decoration: new Inputdecoration(
labelText: "Netto",border: new OutlineInputBorder(
borderRadius: new BorderRadius.circular(25.0),style: new TextStyle(
fontFamily: "Poppins",controller: netcon,))
],);
}
}
解决方法
请在 initState 期间初始化您的 TextEditingController。
@override
void initState() {
super.initState();
for (int i = 0; i < widget.listKaryawan.length; i++) {
_brutos.add(new TextEditingController());
_nettos.add(new TextEditingController());
}
}
然后,删除 itemBuilder 中的这些行...
_brutos.add(new TextEditingController());
_nettos.add(new TextEditingController());
注意:当要重新显示/新显示列表项时,将调用 itemBuilder。因此,您的 TextEditingControllers 列表 > 列表项。 (尝试滚动到最底部,然后向上滚动)
,您不能为此使用ListView.builder,您将不得不使用ListView。您不能使用 ListView.builder 构造函数,因为只为那些实际可见的子元素调用构建器。请参阅 ListView.builder 的文档
ListView.builder 构造函数
创建一个可滚动的线性小部件数组,这些小部件是在 需求。
此构造函数适用于具有大(或 无限) 孩子的数量,因为构建器只被调用 那些实际可见的孩子。
请看下面的代码:
import 'package:flutter/material.dart';
import 'dart:math';
final Color darkBlue = const Color.fromARGB(255,18,32,47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
//theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),debugShowCheckedModeBanner: false,home: Scaffold(
body: Center(
child: FormInputAbsenV3(),),);
}
}
class Karyawan {
int id;
String nama;
int jamKerja;
Karyawan({
this.id,this.nama,});
Karyawan.fromJson(Map<String,dynamic> json) {
id = json['id'];
nama = json['nama_karyawan'];
jamKerja = json['jam_kerja'];
}
Map<String,dynamic> toJson() {
final Map<String,dynamic> data = Map<String,dynamic>();
data['id'] = this.id;
data['nama_karyawan'] = this.nama;
data['jam_kerja'] = this.jamKerja;
return data;
}
}
List<Karyawan> _daftarKaryawan = List.generate(
40,(index) => Karyawan(
id: Random().nextInt(100),nama: 'test ${Random().nextInt(100)}',);
class FormInputAbsenV3 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Entry Absen"),body: FormEntry(listKaryawan: _daftarKaryawan));
}
}
class FormEntry extends StatefulWidget {
final List<Karyawan> listKaryawan;
const FormEntry({Key key,this.listKaryawan}) : super(key: key);
@override
_FormEntryState createState() => _FormEntryState();
}
class _FormEntryState extends State<FormEntry> {
List karyawan = [];
final _formKey = GlobalKey<FormState>();
List<TextEditingController> _brutos = [];
List<TextEditingController> _nettos = [];
@override
void initState() {
super.initState();
for (int i = 0; i < widget.listKaryawan.length; i++) {
_brutos.add(TextEditingController());
_nettos.add(TextEditingController());
}
}
void addlistAbsen() {
for (int i = 0; i < widget.listKaryawan.length; i++) {
karyawan.add({
"id": widget.listKaryawan[i].id,"bruto": _brutos[i].text,"netto": _nettos[i].text
});
}
print(karyawan);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
margin: EdgeInsets.all(5.0),child: Form(
key: _formKey,child: Container(
// child: ListView.builder(
// itemCount: widget.listKaryawan.length,// itemBuilder: (context,index) {
// _brutos.add(new TextEditingController());
// _nettos.add(new TextEditingController());
// return Column(
// children: [
// FormWidget(
// index: index,// nama: widget.listKaryawan[index].nama,// brucon: _brutos[index],// netcon: _nettos[index],// ),// SizedBox(
// height: 20.0,// ],// );
// },// ),child: ListView(
children: [
for (int index = 0; index < widget.listKaryawan.length; index++)
Column(
children: [
FormWidget(
index: index,nama: widget.listKaryawan[index].nama,brucon: _brutos[index],netcon: _nettos[index],SizedBox(
height: 20.0,],floatingActionButton: FloatingActionButton.extended(
icon: Icon(Icons.save),label: Text("Save"),onPressed: () {
if (_formKey.currentState.validate()) {
addlistAbsen();
}
},);
}
}
class FormWidget extends StatelessWidget {
final int index;
final String nama;
final TextEditingController brucon;
final TextEditingController netcon;
const FormWidget({this.index,this.brucon,this.netcon});
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [
Expanded(
child: Text("${index + 1}. ${nama}"),Expanded(
child: TextFormField(
decoration: InputDecoration(
labelText: "Bruto",fillColor: Colors.white,border: OutlineInputBorder(
borderRadius: BorderRadius.circular(25.0),borderSide: BorderSide(),style: TextStyle(
fontFamily: "Poppins",controller: brucon,SizedBox(
width: 20.0,Expanded(
child: TextFormField(
decoration: InputDecoration(
labelText: "Netto",border: OutlineInputBorder(
borderRadius: BorderRadius.circular(25.0),style: TextStyle(
fontFamily: "Poppins",controller: netcon,))
],);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。