لقد وجدت فكرة خلال البحث، وهي حقن ال divider لمصفوفة widgets بالاستعانة بمفهوم الإضافة extention من خلال عمل مؤشر يتحرك على القائمة ثم يبني واحدة أخرى ديناميكياً بإضافة widget هي separator
extension IterableExt<T> on Iterable<T> {
Iterable<T> superJoin(T separator) {
final iterator = this.iterator;
if (!iterator.moveNext()) return [];
final _l = [iterator.current];
while (iterator.moveNext()) {
_l..add(separator)..add(iterator.current);
}
return _l;
}
}
وطريقة الاستدعاء تكون:
return Row(
children: <Widget>[
const Text('Foo'),
const Text('Foo'),
const Text('Bar'),
].superJoin(const SizedBox(width: 10,)).toList(),
);
نقوم باستدعاء superJoin وتمرير الفاصل له ليقوم بحقنه بين كل عنصرين.
لطريقة أخرى، عليكا بناء دالة تعيد
List<Widget>
وتنفيذ الفكرة كالتالي:
دالة تعيد قائمة من الواجهات
تستقبل قائمة من العناصر
نمرر لها separator
نقوم بالمرور على القائمة الأساسية و نأخذ منها العناصر ونضيفهم للقائمة الثانية مع ال separator بالتناوب
سوف يمثل استدعاء هذه الدالة قيمة children
List<Widget> createRowChildrenWithPadding(List<Widget> widgets, Padding pading) {
var joined = List<Widget>();
for (var i = 0; i < widgets.length; i++) {
if ( i != widgets.length - 1) {
joined.add(widgets[i]);
joined.add(padding);
} else {
joined.add(widgets[i]);
}
}
return joined;
}
بالنسبة للخطأ السابق،
أعتقد أن حله يكون كالتالي:
return Column(
children: <Widget>
snapshot.data[index].forEach((key, value){
return Container(
margin: EdgeInsets.only(left: 20.0, right: 20.0),
child: Text(snapshot.data[index]['name']),
);
}
),
);