RadListView не может прочитать свойство 'picture' из undefined (Android) - PullRequest
0 голосов
/ 06 марта 2019

Я использую RadListView и у меня есть список изображений, который использует loadOnDemand, чтобы загрузить больше. Время от времени я получаю неприятную ошибку на Android с надписью Cannot read property 'picture' of undefined, и это на какое-то время останавливает все приложение.

Это расстраивает, потому что я продолжаю думать, что я исправлю это, когда это не произойдет какое-то время, но потом оно вернется случайно. Я думал, что полный рефакторинг проекта может решить проблему, но это не так.

Я создал пример проекта с проблемой. https://github.com/keerl/radlistview-bug.

Я также создал игровую площадку для этого: https://play.nativescript.org/?id=H7lJuH&template=play-ng&v=3

Я также записал видео о возникшей проблеме. https://www.youtube.com/watch?v=_EGvw8REek8. Проблема очень случайная, иногда она никогда не сработает (что заставляет меня думать, что я ее исправил), а затем случайным образом спустя часы снова начинают происходить. Только происходит на Android. Я пытался использовать плагины для кэширования изображений (WebImage), думая, что загрузка изображения вызывала проблему, и, возможно, заполнитель мог бы помочь, но это не помогло.

1 Ответ

0 голосов
/ 06 марта 2019

Я обновил игровую площадку для вас.Вы слишком рано уведомили список, что notifyPullToRefreshFinished.

Вы должны сообщать только тогда, когда загружены данные.eg

loadProducts(PullToRefreshInitiated: boolean) {
        return new Promise((resolve, reject) => {
            http.getJSON("https://randomuser.me/api/?results=25&inc=picture").then((r) => {
                this.users$.push(r.results);
                if (PullToRefreshInitiated) {
                    this.listView.notifyPullToRefreshFinished();
                }
                // Load a max of 50 items and then force a pull-to-refresh to get more data.
                if (this.users$.length > 50) {
                    resolve(true);
                }
                else {
                    resolve(false);
                }
            }, (e) => {
                console.log(e)
            });
        });
    }

PS Еще два предложения, которые я лично реализовал в аналогичныхокружение.

  1. Использовать изображение кеш .
  2. Использовать * ngIf , например, <Image *ngIf="item" [src]="item.picture.medium"></Image>, вы можете использовать метку для блока elseиз вас хотят.
...