13

I would like to make an array with JSON, But I duplicate the same post. I am using the REST API JSON plugin for WordPress

More information about WP REST API: https://v2.wp-api.org

This is my JSON code

    [
  {
    "id": 65,
    "date": "2014-08-24T18:56:26",
    "date_gmt": "2014-08-24T18:56:26",
    "guid": {
      "rendered": "http:\/\/********\/********\/?p=1"
    },
    "modified": "2018-06-05T13:24:58",
    "modified_gmt": "2018-06-05T13:24:58",
    "slug": "this-url-wordpress",
    "status": "publish",
    "type": "post",
    "title": {
      "rendered": "\u2018 This a test title 1 \u2019"
     },
     "content": {
       "rendered": "<p>This is a content 1</p>",
       "protected": false
     },
     "excerpt": {
       "rendered": "<p>this a excerpt 1...<\/p>\n",
       "protected": false
     },
     "author": 1,
     "featured_media": 468,
     "comment_status": "open",
     "ping_status": "open",
     "sticky": false,
     "template": "",
     "format": "standard",
     "meta": [ 
     ],
     "categories": [
      14
     ],
     "tags": [
      17,
      18
     ],
  },
  {
    "id": 650,
    "date": "2014-08-24T18:56:26",
    "date_gmt": "2014-08-24T18:56:26",
    "guid": {
      "rendered": "http:\/\/********\/********\/?p=1"
    },
    "modified": "2018-06-05T13:24:58",
    "modified_gmt": "2018-06-05T13:24:58",
    "slug": "this-url-wordpress",
    "status": "publish",
    "type": "post",
    "title": {
      "rendered": "\u2018 This a test title 2 \u2019"
     },
     "content": {
       "rendered": "<p>This is a content 2</p>",
       "protected": false
     },
     "excerpt": {
       "rendered": "<p>this a excerpt 2...<\/p>\n",
       "protected": false
     },
     "author": 1,
     "featured_media": 468,
     "comment_status": "open",
     "ping_status": "open",
     "sticky": false,
     "template": "",
     "format": "standard",
     "meta": [ 
     ],
     "categories": [
      14
     ],
     "tags": [
      17,
      18
     ],
  },
  {
    "id": 230,
    "date": "2014-08-24T18:56:26",
    "date_gmt": "2014-08-24T18:56:26",
    "guid": {
      "rendered": "http:\/\/********\/********\/?p=1"
    },
    "modified": "2018-06-05T13:24:58",
    "modified_gmt": "2018-06-05T13:24:58",
    "slug": "this-url-wordpress",
    "status": "publish",
    "type": "post",
    "title": {
      "rendered": "\u2018 This a test title 3 \u2019"
     },
     "content": {
       "rendered": "<p>This is a content 3</p>",
       "protected": false
     },
     "excerpt": {
       "rendered": "<p>this a excerpt 3...<\/p>\n",
       "protected": false
     },
     "author": 1,
     "featured_media": 468,
     "comment_status": "open",
     "ping_status": "open",
     "sticky": false,
     "template": "",
     "format": "standard",
     "meta": [ 
     ],
     "categories": [
      14
     ],
     "tags": [
      17,
      18
     ],
  },
]

My code:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:peluqueriafran/WebView.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;

Future<Post> fetchPost() async {
  final response =
  await http.get('http://**********:88/WordPress/wp-json/wp/v2/posts/');
  final responseJson = json.decode(response.body);

  return new Post.fromJson(responseJson);
}

class Post {
    final int id;
    final String title;
    final String body;
    final String urlimagen;
    final String linkWeb;

    Post({this.id, this.title, this.body, this.urlimagen, this.linkWeb});

   factory Post.fromJson(Map<String, dynamic> json) {
      return new Post(
         title: json['title']['rendered'].toString(),
      );
   }
}

WEB:
enter image description here

App: - The last generated is selected, I would like to get all the post.
I hope someone can help me out, thanks
enter image description here

2 Answers 2

28

You could change fetchPost to return a List of Posts, like:

Future<List<Post>> fetchPosts() async {
  http.Response response =
      await http.get('http://**********:88/WordPress/wp-json/wp/v2/posts/');
  List responseJson = json.decode(response.body);
  return responseJson.map((m) => new Post.fromJson(m)).toList();
}

and you could then utilize the Future<List<Post>> like this:

@override
Widget build(BuildContext context) {
  return new FutureBuilder<List<Post>>(
    future: fetchPosts(),
    builder: (context, snapshot) {
      if (!snapshot.hasData) return Container();
      List<Post> posts = snapshot.data;
      return new ListView(
        children: posts.map((post) => Text(post.title)).toList(),
      );
    },
  );
}

ListView takes a List of children, just like Column etc. So you could use any of the Widgets that enclose a list of children

Sign up to request clarification or add additional context in comments.

7 Comments

In case you need it, I give you my class pastebin.com/b3AJeD3U
Añadí y él dice: El 'título' Getter no está definido para la clase 'Lista <Publicación>' Mira la imagen: imgur.com/a/fPdLtDm
You now have a List of Posts, so you have to turn it into a list of Widgets. snapshot.data is now a List so look into ListView.builder
added to the answer
@Santiago itemBuilder needs to be a method taking a context and an int that returns just one widget (based on the value of the int), for example: itemBuilder: (_, i) => Text(posts[i].title)
|
3
{
  "key": "message",
  "texts": [
    {
      "lan": "en",
      "text": "You have pushed this button many times"
    },
    {
      "lan": "tr",
      "text": "Bu butona bir çok kez bastınız"
    },
    {
      "lan": "ru",
      "text": "Вы много раз нажимали кнопку"
    }
  ]
}

class Lang {
  final String key;
  final List<dynamic> texts;

  Lang(this.key, this.texts);

  Lang.fromJson(Map<String, dynamic> json)
      : key = json['key'],
        texts = json['texts'];

  Map<String, dynamic> toJson() => {
        'key': key,
        'texts': texts,
      };
}

class Texts {
  final String lan;
  final String text;

  Texts(this.lan, this.text);

  Texts.fromJson(Map<String, dynamic> json)
      : lan = json['lan'],
        text = json['text'];

  Map<String, dynamic> toJson() => {
        'lan': lan,
        'text': text,
      };
}


  Map<String, dynamic> languages = json.decode(jsonCrossword);
  var user = new Lang.fromJson(languages);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.