ListView.builder'ı Anlama
Tamam, sanırım biraz flutter oluşturucuya takıldım.
Sadece sorumu kolaylaştırmak için basit bir uygulama oluşturdum:
Bir veri sınıfım var:
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'),
),
];
}
Ve ana dart dosyası:
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,
),
);
}
}
Sorun şu: Başka bir şekilde çalışmasını sağlayamam. Birisi uygulamamı ListView.builder olarak değiştirebilir mi? Biraz sıkışıp kaldım :( Temel hedef:
Fikir: Bir düğmeye tıklayın -> form belirir -> bir gönder düğmesine bastıktan sonra liste anında güncellenir, daha sonra bir silme işlevi ekleyeceğim, sadece dokümanları öğreniyorum, daha fazlası değil.
Birisi kodumu gözden geçirebilir ve kimsenin sakıncası yoksa, aynı fikri yeniden yazmaya çalışabilir, ancak ListView.builder kullanarak?
Birkaç kez denedim, ancak özellikleri formdan doğru bir şekilde alamıyorum ve oluşturucu kullanarak listtile'ı güncelleyemiyorum, yardıma ihtiyacım var
Şerefe!
Yanıtlar
ListView.builder statik bir yükseklik gerektirir, bu yüzden bunu takip edin. Şimdi, kullanmak istediğiniz soruya geliyor ListView.builder
. Bununla yapabilirsin
Container(
height: give_your_height,
child: ListView.builder(
shrinkWrap: true,
itemCount: dataLists.lists.length,
itemBuilder: (context, index) {
return dataLists.lists[index];
}
)
)
Bunu deneyin, sorununuzu çözebilir.
ListView(
children: [
for (ListTile e in dataLists.lists)
Card(child: e)
],
),
veya ile ListView.builder()
ListView.builder(
itemCount: dataLists.lists.length,
itemBuilder: (context, index) {
return dataLists.lists[index];
},
);
Daha Fazla Referans: https://api.flutter.dev/flutter/material/ListTile-class.html