![](/img/trans.png)
[英]Dart convert Map<dynamic, dynamic> to Map<String, List<String>>
[英]Dart: Convert map (Key / Value) into an Ordered List[]
我從 firestore 接收文檔快照並將其轉換為Map<String, dynamic>
並且我知道地圖沒有排序,但是,我想按特定順序對屏幕字段的布局進行排序。 問題是,我想要實現的順序不是字母順序。 這是我的 map 的示例:
Map<String, dynamic> customerInfo = {
'projectName': 'John Doe',
'state': 'Arizona',
'city': 'Tempe',
'estimate': 123000,
'geoLocation': '12.345678,23.456789'
}
因此,我將此 map 發送到循環以迭代鍵/值並將它們轉換為小部件列表,但是,對於某些屏幕,我需要將“狀態”作為第一個小部件,將“城市”作為第二個小部件, 對於其他屏幕反之亦然。 有些地圖會有更多的字段,那些額外的字段以后不會有關系,我只想為某些字段保持一定的順序,如果它們存在的話。
我嘗試使用switch / if
循環鍵以匹配鍵並執行List<Widget>().add(Text(key, value))
但是,生成的列表顯然仍然是無序的。 這是我要實現的示例代碼:
class ProjectViews {
List<Widget> projectDetailedView(Map<String, dynamic> data) {
final List<Widget> fields = [];
fields.add(
Text(
data['projectName'],
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: constants.primaryTextColor,
),
textAlign: TextAlign.start,
),
);
data.forEach((key, value) {
if (key == 'state') {
fields.add(dataField(key, value));
} else if (key == 'city') {
fields.add(dataField(key, value));
} else if (key == 'estimate') {
fields.add(dataField(key, value));
}
// switch (key) {
// case 'state':
// fields.add(dataField(key, value));
// break;
// case 'city':
// fields.add(dataField(key, value));
// break;
// case 'estimate':
// fields.add(dataField(key, value));
// break;
// }
});
return fields;
}
Widget dataField(String key, dynamic value) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
key,
style: TextStyle(fontSize: 20),
),
Text(
value.toString(),
style: TextStyle(fontSize: 20),
),
],
),
);
}
}
我想確保List<Widget> fields
按特定順序添加。 收到的 map 可能包含 5 個元素或 20 個元素,只有其中一些需要按順序排列。
我可以使用按我的首選順序排列的List<String>
並根據此列表轉換 map 嗎?
請問還有其他選擇可以實現嗎?
謝謝
也許您可以使用LinkedHashMap 。 它保持密鑰插入順序。
FirebaseFirestore 有一個.orderBy() function,您可以在查詢集合時使用它對數據進行排序。
QuerySnapshot<Map<String, dynamic>> snapshot =
await firestoreInstance.collection('collectionName')
.orderBy('value', descending: false)
.get();
注意:您的問題似乎是您正在嘗試從 firebase 獲取客戶信息列表,因此您只需將我的代碼中的“collectionName”替換為客戶信息集合的名稱。 這是一個查詢快照,因為它查詢集合並獲取集合中的所有客戶信息。
您還必須將我的代碼中的“值”替換為您希望訂購它的值的鍵。 您還可以通過將降序值設置為 true 或 false 來選擇是升序還是降序。
我希望這有幫助。
所以這是我對這個問題的解決方案,基本上你創建一個新的有序 map,只有你想按顯示順序顯示的字段名稱,然后用數據/小部件填充這個新的 map。
class ProjectViews {
List<Widget> projectDetailedView2(Map<String, dynamic> data) {
final List<Widget> fields = [];
final Map<String, dynamic> orderedFields = {
'state': '',
'city': '',
'geoLocation': '',
}; // this map has the items we want to display in the order we want
fields.add(
Text(
data['projectName'],
style: TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
color: constants.primaryTextColor,
),
textAlign: TextAlign.start,
),
);
data.forEach((key, value) {
if (orderedFields.keys.contains(key)) {
orderedFields[key] = dataField(key, value);
}
});
orderedFields.forEach((key, value) {
if (value.runtimeType == Widget) {
fields.add(value);
}
});
return fields;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.