Flutter / Dart - Как обрабатывать данные Json, содержащие список, разделенный запятыми? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть PageViewBuilder, который использует Map<String> из json данных, содержащих строку с именем name и другую с именем tagname. Проблема в том, что строка tagname на самом деле представляет собой список из трех тегов, разделенных запятыми, которые печатаются как «лодка, трава, жабы»; Но я хотел бы разделить эту строку, чтобы я мог сделать каждый элемент интерактивной кнопкой. IE:

FlatButton( onPressed: () => boat(),
              text: "boat", 
            );

FlatButton( onPressed: () => grass(),
              text: "grass", 
            );

FlatButton( onPressed: () => toads(),
              text: "toads", 
            );

Я пытался использовать функцию разделения Dart следующим образом;

var splitag = tagname.split(",");
var splitag1 = splitag[0];
var splitag2 = splitag[1];
var splitag3 = splitag[2];

Но это выдает ошибку, если любое из трех имен тегов недействительно.

Итак, я попробовал это;

String splitagone = splitag1 ?? "";
String splitagtwo = splitag2 ?? "";
String splitagthree = splitag3 ?? "";

Но это все равно дало мне ошибку. Так может ли кто-нибудь предложить другой способ выполнить sh то, что мне нужно? Вот полный код:

  class SpeakContent {
  final String name, tagname;

  SpeakContent({
    this.name,
    this.tagname
  });

  factory SpeakContent.fromJson(Map<String, dynamic> jsonData) {
    return SpeakContent(
      name: jsonData['name'],
      tagname: jsonData['tagname'],
    );
  }
}

 class StageBuilder extends StatelessWidget {

  final List<SpeakContent> speakcrafts;
  StageBuilder(this.speakcrafts);

  @override
  Widget build(context) {
    return PageView.builder(
      itemCount: speakcrafts.length,
      itemBuilder: (context, int currentIndex) {
        return createViewItem(speakcrafts[currentIndex], context);
      },
    );
  }

  Widget createViewItem(SpeakContent speakcraft, BuildContext context) {

    return Column(
      children: <Widget>[
        Container(
          child: Text(
            speakcraft.name,
          ),
        ),
        Container(child:
            FlatButton( onPressed: () => boat(),
              child: Text('boat'),
            ),
        ),
        Container(child:
        FlatButton( onPressed: () => grass(),
          child: Text('grass'),
        ),
        ),
        Container(child:
        FlatButton( onPressed: () => toads(),
          child: Text('toads'),
        )
        ),
      ],
    );
  }
}

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Можно сделать что-то вроде этого ..

  Widget createViewItem(SpeakContent speakcraft, BuildContext context) {
    
    List<Widget> columnChildren = [];
    Text name = Text(speakcraft.name);
    columnChildren.add(name);

    speakcraft.tagname.split(',').forEach((String tag) {
      FlatButton tagButton = FlatButton(
        child: Text(tag),
        onPressed: (){},
      );
      columnChildren.add(tagButton);
    });

    return Column(
      children: columnChildren,
    );
    
  }
0 голосов
/ 03 августа 2020

Вы можете попробовать:

var response = await http.get(
        Uri.encodeFull("...."),
        headers: {
          ...
        }
    );

this.setState(() {
  testList = json.decode (response.body) as List;
**testList[0];
testList[1];**
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...