Непонятная ошибка из проверенного режима dart2js
Моя первоначальная ошибка была An attempt was made to use an object that is not, or is no longer, usable
, После запуска dart2js с настройками по умолчанию его довольно сложно прочитать, и у меня возникли проблемы с отладкой вывода, поэтому я добавил эти параметры в свой pubspec.yaml
:
- $dart2js:
checked: true
sourceMaps: true
verbose: true
minify: false
Я ожидал, что что-то сломается, но я надеялся, что сообщение об ошибке будет достаточно ясным, чтобы я мог его решить, но я понимаю, какую ошибку я получаю.
Новая ошибка, которую я получаю:
Error:
dart<.wrapException()
dart<._rootHandleUncaughtError_closure.call$0()
dart<._microtaskLoop()
dart<._startMicrotaskLoop<()
dart<._AsyncRun__initializeScheduleImmediate_internalCallback.call$1<()
dart<.invokeClosure_closure0.call$0()
dart<._IsolateContext.eval$1()
dart<._callInIsolate()
dart<.invokeClosure<()
dart<.convertDartClosureToJS/$function</<()
Похоже, у dart возникли проблемы с преобразованием замыкания в функцию js. Я бы подумал, что это будет сделано, когда dart2js
запускается, а не во время работы приложения в браузере.
Мой код не имеет явных замыканий, но я использую async await
, Прав ли я, предполагая, что они будут преобразованы в замыкания?
На всякий случай это актуально, я тоже использую Angular2.
Обновить
Похоже, что мои проблемы вызваны моим использованием HttpRequest.request()
от dart:html
,
HttpRequest res = await HttpRequest.request( "${API_URL}/login",
method : "POST",
responseType: "json",
mimeType : "application/json",
sendData : JSON.encode( req_data ) );
print( res.status );
Если я уберу проверенный режим и соберу это, то получу An attempt was made to use an object that is not, or is no longer, usable
ошибка.
3 ответа
Кажется, я решил проблему, изменив свое использование HttpRequest
учебный класс.
От:
HttpRequest res = await HttpRequest.request( "${API_URL}/login",
method : "POST",
responseType: "json",
mimeType : "application/json",
sendData : JSON.encode( req_data ) );
print( res.status );
Для того, чтобы:
HttpRequest res = new HttpRequest()
..open( "POST", "${API_URL}/login" );
req
..onLoadEnd.listen( ( ProgressEvent e ) {
print( res.status );
})
..send( JSON.encode( req_data ) );
Я не уверен, что было на самом деле проблема, но таким образом я не понимаю ни InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable
или более длинная ошибка дротика:
Error:
dart<.wrapException()
dart<._rootHandleUncaughtError_closure.call$0()
dart<._microtaskLoop()
dart<._startMicrotaskLoop<()
dart<._AsyncRun__initializeScheduleImmediate_internalCallback.call$1<()
dart<.invokeClosure_closure0.call$0()
dart<._IsolateContext.eval$1()
dart<._callInIsolate()
dart<.invokeClosure<()
dart<.convertDartClosureToJS/$function</<()
Я думаю, что dart2js
есть некоторые проблемы с async await
"неявные" замыкания, и я гораздо счастливее, когда я использую закрытое "явная функция, которая закрывает свою среду".
Спасибо Günter Zöchbauer за помощь.
API лучше, более интуитивно понятен. Например, ваш запрос:
var client = new BrowserClient();
var response = await client.post("${API_URL}/login",
body: JSON.encode( req_data ));
var data = JSON.decode(response.body);
client.close();
И вы, вероятно, могли бы видеть в параметрах, хотите ли вы большей точности определить способ запроса.
Вы должны использовать пакет http вместо