Memahami ListView.builder
Oke, jadi saya rasa saya sedikit terjebak dengan flutter builder.
Saya telah membuat aplikasi sederhana, hanya untuk membuat pertanyaan saya lebih mudah:
Saya memiliki kelas data:
class DataLists {
List<ListTile> lists = [
ListTile(
leading: Text('Tile Leading 1'),
title: Text('Tile Title 1'),
subtitle: Text('Tile Subtitle 1'),
trailing: Text('Tile Trailing 1'),
),
ListTile(
leading: Text('Tile Leading 2'),
title: Text('Tile Title 2'),
subtitle: Text('Tile Subtitle 2'),
trailing: Text('Tile Trailing 2'),
),
ListTile(
leading: Text('Tile Leading 3'),
title: Text('Tile Title 3'),
subtitle: Text('Tile Subtitle 3'),
trailing: Text('Tile Trailing 3'),
),
ListTile(
leading: Text('Tile Leading 4'),
title: Text('Tile Title 4'),
subtitle: Text('Tile Subtitle 4'),
trailing: Text('Tile Trailing 4'),
),
ListTile(
leading: Text('Tile Leading 5'),
title: Text('Tile Title 5'),
subtitle: Text('Tile Subtitle 5'),
trailing: Text('Tile Trailing 5'),
),
];
}
Dan file panah utama:
import 'package:flutter/material.dart';
import 'package:learning/data.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: TestTile(),
);
}
}
class TestTile extends StatefulWidget {
@override
_TestTileState createState() => _TestTileState();
}
class _TestTileState extends State<TestTile> {
DataLists dataLists = DataLists();
TextEditingController leadingController = TextEditingController();
TextEditingController titleController = TextEditingController();
TextEditingController subtitleController = TextEditingController();
TextEditingController trailingController = TextEditingController();
Future<String> createDialog(BuildContext context) {
return showDialog(context: context, builder: (context) {
return SimpleDialog(
title: Text('Input data: '),
children: [
TextField(
controller: leadingController,
),
TextField(
controller: titleController,
),
TextField(
controller: subtitleController,
),
TextField(
controller: trailingController,
),
MaterialButton(
child: Text('Submit'),
onPressed: () {
Navigator.of(context).pop(leadingController.text);
setState(() {
List<ListTile> tempList = dataLists.lists;
if (titleController.text.isNotEmpty && leadingController.text.isNotEmpty && subtitleController.text.isNotEmpty && trailingController.text.isNotEmpty) {
tempList.add(
ListTile(
leading: Text(leadingController.text),
title: Text(titleController.text),
subtitle: Text(subtitleController.text),
trailing: Text(trailingController.text),
),
);
dataLists.lists = tempList;
} else {
print('Null values');
}
leadingController.clear();
titleController.clear();
subtitleController.clear();
trailingController.clear();
});
},
),
],
);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Test Tile'),
),
body: Container(
child: SafeArea(
child: ListView(
children: <ListTile>[
for (ListTile e in dataLists.lists)
e
],
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
createDialog(context);
setState(() {
});
},
child: Icon(Icons.add),
backgroundColor: Colors.blue,
),
);
}
}
Masalahnya adalah: Saya tidak bisa membuatnya bekerja dengan cara lain. Bisakah seseorang mengubah implementasi saya menjadi ListView.builder? Saya terjebak sedikit :( Tujuan utama:
Ide: Klik pada sebuah tombol -> form muncul -> setelah Anda menekan tombol submit daftar diperbarui secara instan saya akan menambahkan fungsi hapus nanti, hanya dokumen belajar, tidak lebih.
Dapatkah seseorang meninjau kode saya dan, jika tidak ada yang keberatan, mencoba menulis ulang ide yang sama, tetapi menggunakan ListView.builder?
Saya sudah mencoba beberapa kali, tetapi tidak bisa mendapatkan properti dengan benar dari formulir, dan memperbarui listtile menggunakan pembangun, butuh bantuan
Bersulang!
Jawaban
ListView.builder membutuhkan tinggi statis, jadi pantau terus yang itu. Sekarang, sampai pada pertanyaan, yang ingin Anda gunakan ListView.builder
. Anda dapat melakukannya melalui ini
Container(
height: give_your_height,
child: ListView.builder(
shrinkWrap: true,
itemCount: dataLists.lists.length,
itemBuilder: (context, index) {
return dataLists.lists[index];
}
)
)
Coba ini, ini dapat menyelesaikan masalah Anda.
ListView(
children: [
for (ListTile e in dataLists.lists)
Card(child: e)
],
),
atau dengan ListView.builder()
ListView.builder(
itemCount: dataLists.lists.length,
itemBuilder: (context, index) {
return dataLists.lists[index];
},
);
Referensi Lebih Lanjut: https://api.flutter.dev/flutter/material/ListTile-class.html