Выполнение цикла for после завершения одного из них в flutter

#android #dart #flutter

#Android #dart #flutter

Вопрос:

Ответ сервера, возвращающий три массива JSON, и все объекты хранятся в базе данных один за другим и optionsGroupList , attributes assignedattributes . В проекте у меня есть три таблицы с именами group , attribute и assignedattribute . во-первых, я должен вставить все элементы optionsGroupList в таблицу групп, и я могу это сделать, во втором массиве, который я получаю groupid , attributeid , attributename но во второй таблице у меня есть 4 столбца, в которых есть groupid , attributeid attributename , groupname ,,, но для groupname я должен получить запись определенной группы по идентификатору группы из таблицы групп, но мой второй цикл выполняется первым, поэтому я не могу получить запись группы из-за того, что цикл все еще вставляет записи, когда начался мой второй цикл прежде чем завершить первую, моя вторая таблица зависит от первой, а моя третья таблица зависит от второй, поэтому мне нужно вставить запись после завершения одной. Иногда это работает правильно

 {
    "result": 1,
    "data": "optionsList",
    "merchantid": "MER-07156",
    "optionsGroupList": [{
        "grouprowid": "3012",
        "groupname": "Color",
        "isrequired": "0"
    }],
    "attributes": [{
        "attributerowid": "20794",
        "grouprowid": "3012",
        "attributename": "Red",
        "weight": "0"
    }],
    "assignedattributes": [{
            "attributegrouprowid": "154577",
            "productrowid": "342702",
            "attributerowid": "20794",
            "subsku": "",
            "quantity": "0",
            "pricechange": "4"
        },
        {
            "attributegrouprowid": "154590",
            "productrowid": "354723467",
            "attributerowid": "20794",
            "subsku": "0",
            "quantity": "0",
            "pricechange": "0"
        }
    ]
}
  

Мой второй оператор отладки цикла печатается перед первым.

 optionListService().then((onValue) async {
  if (onValue.result == 1) {

    //Loop 1
    for(int i=0;i<onValue.optionsGroupList.length;i  ){
      _insertOption(onValue.optionsGroupList[i]);
    }

    //Loop 2
    for(int j=0;j<onValue.attributes.length;j  ){
      debugPrint('Attribute Name:--${ onValue.attributes[j].attributename}');// this is printed first before first loop excuted
      List groupIdList=new List<Map<String,dynamic>>();
      groupIdList= await dbHelper.queryReadOption(onValue.attributes[j].grouprowid); // here i'm finding group name from group table but i think is executing first.

      if(groupIdList.length>0){

        _insertOptionAttribute(onValue.attributes[j],groupIdList[0][DatabaseHelper.columnGroupName],groupIdList[0][DatabaseHelper.columnIsRequired]);
      }

    }

    //Loop 3
  for(int i=0;i<onValue.assignedattributes.length;i  ){

      String attr=onValue.assignedattributes[i].attributerowid;
      arrtIdList=new List<Map<String,dynamic>>();
      arrtIdList= await dbHelper.queryReadAttribute(attr);
      if(arrtIdList.length>0){

        _insertProductWithAttribute(
            onValue.assignedattributes[i],
            arrtIdList[0][DatabaseHelper.columnGroupId],
            arrtIdList[0][DatabaseHelper.columnGroupName],
            arrtIdList[0][DatabaseHelper.columnAttributeName],
            arrtIdList[0][DatabaseHelper.columnIsRequired],
            arrtIdList[0][DatabaseHelper.columnWeight]
        );
      }

    }}});}
  

Ответ №1:

просто добавьте второй цикл в цепочку блоков «then» и в первом блоке верните переменную «onValue». вот так:

 optionListService().then((onValue) async {
    if (onValue.result == 1) {

        //Loop 1
        for(int i=0;i<onValue.optionsGroupList.length;i  ){
            _insertOption(onValue.optionsGroupList[i]);
        }
    }

    return onValue;

}).then((onValue) {
    if (onValue.result == 1) {
        //Loop 2
        for(int j=0;j<onValue.attributes.length;j  ){
            // some code
        }
    }
});