सूची दृश्य समझना
ठीक है, इसलिए मुझे लगता है कि मैं फड़ बिल्डर के साथ थोड़ा फंस गया हूं।
मैंने सरल ऐप बनाया है, बस अपने प्रश्न को आसान बनाने के लिए:
मेरे पास एक डेटा वर्ग है:
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'),
),
];
}
और मुख्य डार्ट फ़ाइल:
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,
),
);
}
}
समस्या यह है: मैं इसे दूसरे तरीके से काम नहीं कर सकता। क्या कोई मेरे कार्यान्वयन को ListView.builder में बदल सकता है? मैं थोड़ा फंस गया हूं :( मुख्य लक्ष्य:
आइडिया: एक बटन पर क्लिक करें -> फ़ॉर्म दिखाई दें -> प्रेस करने के बाद सबमिट बटन सूची को तुरंत अपडेट किया जाता है, मैं बाद में एक डिलीट फ़ंक्शन जोड़ूंगा, बस डॉक्स सीखना, और कुछ नहीं।
क्या कोई मेरे कोड की समीक्षा कर सकता है, और यदि कोई नहीं करता है, तो एक ही विचार को फिर से लिखने की कोशिश करें, लेकिन सूची दृश्य का उपयोग करके।
मैंने कई बार कोशिश की है, लेकिन फ़ॉर्म से सही तरीके से गुण प्राप्त नहीं कर सकते हैं, और बिल्डर का उपयोग करके सूची को अपडेट करें, मदद की आवश्यकता है
चियर्स!
जवाब
ListView.builder को एक स्थिर ऊंचाई की आवश्यकता होती है, इसलिए उस पर नज़र रखें। अब, इस सवाल पर आ रहे हैं, जिसे आप उपयोग करना चाहते हैं ListView.builder
। आप इसके माध्यम से कर सकते हैं
Container(
height: give_your_height,
child: ListView.builder(
shrinkWrap: true,
itemCount: dataLists.lists.length,
itemBuilder: (context, index) {
return dataLists.lists[index];
}
)
)
यह कोशिश करो, यह आपके मुद्दे को हल कर सकता है।
ListView(
children: [
for (ListTile e in dataLists.lists)
Card(child: e)
],
),
या के साथ ListView.builder()
ListView.builder(
itemCount: dataLists.lists.length,
itemBuilder: (context, index) {
return dataLists.lists[index];
},
);
आगे संदर्भ: https://api.flutter.dev/flutter/material/ListTile-class.html