Трудно сказать, что здесь происходит, но проблема заключается здесь:
providerObj = patientDetailsModel.practiceProviderList.practiceProviders.getItemAt(count, 0).provider as Provider;
В этой строке содержится масса мест, в которых могут возникать исключения нулевого указателя.
Скорее всего - practiceProvider
, возвращенный в позиции count
, не имеет установленного провайдера. Мы не можем видеть, как это значение заполняется, но, учитывая, что этот код работает позже, я бы сказал, что у вас происходит состояние гонки - к данным обращаются до того, как они установлены.
По крайней мере, вы должны добавить guardClause для этого:
var practiceProviders:ArrayCollection = patientDetailsModel.practiceProviderList.practiceProviders;
for (var count:int = 0; count < practiceProviders.length; ++count)
{
providerObj = practiceProviders.getItemAt(count, 0).provider as Provider;
if (!providerObj)
continue;
// etc
}
Состояние гонки немного сложнее, учитывая асинхронный характер вызовов Flex-сервера. (Я предполагаю, что вы загружаете данные с удаленного сервера).
Есть два подхода для решения этой проблемы - либо
- отложить выполнение этого метода до загрузки данных - вы можете сделать это, добавив eventListener к
ResultEvent
RemoteService
или
- Не беспокойтесь об этом в первый раз, но повторяйте метод при каждом изменении данных.
например:
protected function providerList_creationCompleteHandler(event:FlexEvent):void
{
dataProvider.addEventListener(CollectionEvent.COLLECTION_CHANGE,onCollectionChange,false,0,true);
updateProviders();
// Rest of existing creationComplete code moved to updateProviders();
}
private function updateProviders()
{
// Code from existing creationComplete handler goes here
}
private function onCollectionChange(event:CollectionEvent):void
{
updateProviders();
}