簡體   English   中英

Dart:將 map(鍵/值)轉換為有序列表[]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM