Только один элемент отображается одновременно в списке - PullRequest
0 голосов
/ 17 февраля 2019

Я не могу понять, как заставить все мои элементы в моем списке отображаться в виде списка

В настоящее время, когда я нажимаю кнопку, чтобы отобразить список, отображается только один элемент.Если я щелкну назад и снова нажму на главную кнопку, в списке появятся 2 элемента.Промыть и повторить, 3 предмета.Кажется, я не могу отладить операторы печати, чтобы увидеть, в чем заключается моя ошибка.Когда я пытаюсь распечатать (следы) или другие варианты, это говорит, что Экземпляр модели следа (не очень полезный).Есть идеи?

Вот мой код:

class HomeScreen extends State<MyApp> {
  int counter = 0;
  Future<List<TrailModel>> fetchData() async {
    counter++;
    var response = await get(
        'https://www.hikingproject.com/data/get-trails?lat=39.733694&lon=-121.854771&maxDistance=10&key=200419778-6a46042e219d019001dd83b13d58aa59');

    final trailModel = TrailModel.fromJson(json.decode(response.body));
    //trails.add(trailModel);
    setState(() {
      trails.add(trailModel);
    });

    return trails;
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
      appBar: AppBar(title: Text("HikeLocator")),
      body: new RaisedButton(
        child: Text("click me"),
        onPressed: () async {
          final trails = await fetchData();
          Navigator.push(
            context,
            new MaterialPageRoute(builder: (context) => new ListScreen(trails)),
          );
        },
      ),
    ));
  }
}

class ListScreen extends StatelessWidget {
  final List<TrailModel> trails;
  ListScreen(this.trails);

  @override
  Widget build(BuildContext ctxt) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Here are your trails"),
      ),
      body: TrailList(trails),
    );
  }
}

class TrailList extends StatelessWidget {
  final List<TrailModel> trails;

  TrailList(this.trails);

  Widget build(context) {
    return ListView.builder(
      itemCount: trails.length,
      itemBuilder: (context, int index) {
        Object myText = json.encode(trails[index].trails);

        List<dynamic> myText2 = json.decode(myText);

        return Text(myText2[index]['name']);
      },
    );
  }
}

class TrailModel {
  Object trails;
  TrailModel(this.trails);
  TrailModel.fromJson(Map<String, dynamic> parsedJson) {
    trails = parsedJson['trails'];
  }
}

Я думаю, что моя проблема может заключаться в fetchData (), но я не совсем уверен.Попытка по крайней мере распечатать значения, чтобы ограничить, где моя проблема может быть.(Это только добавление 1 к списку каждый раз, когда я нажимаю кнопку? Это только рендеринг одного, когда я нажимаю на нее? Это выборка всех данных каждый клик или только один объект json? И т. Д.)

Спасиболюбезно за любую помощь.Извините, я новичок в дартс, так что это огромная кривая обучения для

1 Ответ

0 голосов
/ 17 февраля 2019

В вашем коде есть пара проблем.Основная причина того, что это не работает так, как вы ожидаете, заключается в том, что вы разбираете все элементы json в один объект TrailModel, но тогда ваш код предполагает, что у вас будет несколько TrailModel объектов.

Самый простой способ исправить это и заставить его работать - это использовать список из TrailModel.trails вместо списка в виджете.

Сначала, в ListScreen, пропустите только первый элемент в списке.

class ListScreen extends StatelessWidget {
  final List<TrailModel> trails;
  ...
  @override
  Widget build(BuildContext ctxt) {
    return new Scaffold(
      ...
      body: TrailList(trails.first),
    );
  }
}

Затем в TrailList используйте список trails, который у вас есть от TrailModel:

class TrailList extends StatelessWidget {
  final TrailModel model;
  TrailList(this.model);

  Widget build(context) {
    return ListView.builder(
      itemCount: model.trails.length,
      itemBuilder: (context, int index) {
        final trail = model.trails[index];
        ...
      },
    );
  }
}

Когда я пытаюсь выполнить печать (трейлы) илив других вариациях говорится, что экземпляр модели следа (не очень полезный)

print использует вывод метода toString в ваших классах.Вы видите Instance of trail model, потому что это реализация по умолчанию, которую вы получаете от суперкласса Object.Вы можете изменить это, чтобы получить что-то более полезное:

class TrailModel {
  @override
  String toString() => 'trails=$trails';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...