Для каждого цикла создания массива в dart

#dart #flutter

#dart #flutter

Вопрос:

Нам нужно создать для каждого цикла, который создает массив из вызова JSON. Я новичок в flutter, поэтому я ищу лучший способ сделать это с точки зрения производительности. Вот существующий код на данный момент:

Это формат массива, который нам нужен для выполнения цикла с помощью вызова JSON и создания

 var ForumPostArr = [
  new ForumPostEntry("User1", "2 Days ago", 0 , 0 , "Hello,nnLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."),
  new ForumPostEntry("User2", "23 Hours ago", 1 , 0 , "Pellentesque justo metus, finibus porttitor consequat vitae, tincidunt vitae quam. Vestibulum molestie sem diam. Nullam pretium semper tempus. Maecenas lobortis lacus nunc, id lacinia nunc imperdiet tempor. Mauris mi ipsum, finibus consectetur eleifend a, maximus eget lorem. Praesent a magna nibh. In congue sapien sed velit mattis sodales. Nam tempus pulvinar metus, in gravida elit tincidunt in. Curabitur sed sapien commodo, fringilla tortor eu, accumsan est. Proin tincidunt convallis dolor, a faucibus sapien auctor sodales. Duis vitae dapibus metus. Nulla sit amet porta ipsum, posuere tempor tortor.nnCurabitur mauris dolor, cursus et mi id, mattis sagittis velit. Duis eleifend mi et ante aliquam elementum. Ut feugiat diam enim, at placerat elit semper vitae. Phasellus vulputate quis ex eu dictum. Cras sapien magna, faucibus at lacus vel, faucibus viverra lorem. Phasellus quis dui tristique, ultricies velit non, cursus lectus. Suspendisse neque nisl, vestibulum non dui in, vulputate placerat elit. Sed at convallis mauris, eu blandit dolor. Vivamus suscipit iaculis erat eu condimentum. Aliquam erat volutpat. Curabitur posuere commodo arcu vel consectetur."),
  new ForumPostEntry("User3", "2 Days ago", 5 , 0 , "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."),
  new ForumPostEntry("User4", "2 Days ago", 0 , 0 , "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."),
  ];
  

Вот вызов JSON, возвращающий несколько объектов ответа

 Future<ForumAnswers> getForumAnswers(String postID) async {
   final response =
  await http.post('/api/ForumAnswers',
  headers: {"Content-Type": "application/json", 
             'Accept': 'application/json',},
  body: json.encode({'PostID' : postID }));

  if (response.statusCode == 200) {
  // If the call to the server was successful, parse the JSON
   ForumAnswers _answers;
    _answers = ForumAnswers.fromJson(json.decode(response.body));

    return _answers;

    } else {
    // If that call was not successful, throw an error.
    throw Exception('Failed to load object');
  }

}
  

Комментарии:

1. Можете ли вы добавить, как выглядит пример ответа в вашем сообщении?

Ответ №1:

Для этого вопроса могло бы потребоваться намного больше информации, но и этого достаточно. Есть два способа сделать это — самый простой — использовать декодер json из библиотеки convert и декодировать вручную. Другой вариант — использовать библиотеку сериализации json, которая использует генерацию кода во время компиляции для создания процедур сериализации / десериализации для вашего класса.

Я не буду вдаваться в генерацию кода, но вот как я бы сделал это вручную:

 import 'dart:convert';

class ForumAnswers {
  final List<ForumAnswer> answers;

  ForumAnswers(this.answers);

  factory ForumAnswers.fromJson(String jsonText) {
    return ForumAnswers((json.decode(jsonText) as List).map((item) => ForumAnswer.fromJson((item as Map).cast())).toList());
  }

  @override
  String toString() {
    return answers.toString();
  }
}

class ForumAnswer {
  final String userId;
  final DateTime timestamp;
  final int views;
  final String text;

  ForumAnswer({this.userId, this.timestamp, this.views, this.text});

  String get daysAgo {
    int daysAgo = -timestamp.difference(DateTime.now()).inDays;
    if (daysAgo == 1) {
      return "1 day ago";
    } else {
      return "$daysAgo days ago";
    }
  }

  static const String USERID = "userid";
  static const String TIMESTAMP = "timestamp";
  static const String VIEWS = "views";
  static const String TEXT = "text";

  factory ForumAnswer.fromJson(Map<String, dynamic> map) {
    String userId = map[USERID];
    String dateTimeString = map[TIMESTAMP];
    int views = map[VIEWS];
    String text = map[TEXT];

    DateTime dateTime = DateTime.parse(dateTimeString);

    return ForumAnswer(userId: userId, timestamp: dateTime, views: views, text: text);
  }

  @override
  String toString() {
    return "$runtimeType(userid=$userId, ago=$daysAgo, views=$views, text=$text)";
  }
}

void main() {
  String json = """
  [
    {"userid": "User1", "timestamp": "2019-03-24 13:27:00.123456z", "views": 3, "text": "Hello" },
    {"userid": "User2", "timestamp": "2019-03-28 13:30:00.234234z", "views": 2, "text": "Hello to you too" },
    {"userid": "User1", "timestamp": "2019-03-29 13:42:00.982178z", "views": 1, "text": "Goodbye" }
  ]
  """;

  print("Decoded from json: ${ForumAnswers.fromJson(json)}");
}
  

Или посмотрите это в dartpad.

Это делает несколько предположений, которые отсутствовали в вашем вопросе… например, что на самом деле представляют собой классы ForumAnswer и ForumAnswers, как выглядит json, который вы получаете обратно, и каковы параметры в вашем ForumPostEntry. Но вы должны иметь возможность вносить изменения, чтобы делать то, что вы хотите от этого кода.

Я бы рекомендовал прочитать документацию flutter для json, поскольку она объясняет в основном то же самое, что и мой код, а также как использовать библиотеку сериализации.

Комментарии:

1. спасибо за помощь. Один вопрос, почему он выводит [ForumAnswer(userid=User1, timestamp=2012-02-27 13:27:00.123Z, views = 3, text = Hello),

2. формат, который нам нужен, такой: новый ForumPostEntry («Пользователь1», «2 дня назад», 0 , 0 , «Привет, мы не собираемся тратить время на то, чтобы сидеть здесь, собирать информацию элит, откладывать на потом временные инциденты, связанные с трудом и великой потерей. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.»),

3. Ну, поскольку вы на самом деле не предоставили много информации, я просто перешел к основам и подумал, что оставлю остальное вам. Если вы хотите заставить его печатать «2 дня назад», это достаточно просто, я обновлю пример.