2014-12-09 3 views
1

Я пытаюсь использовать пакет firebase, чтобы узнать, могу ли я использовать его с моим приложением | https://pub.dartlang.org/packages/firebaseFirebase (Dart) будущее исключение

Я пытаюсь тайному этот код Javascript

var upvotesRef = new Firebase('https://docs-examples.firebaseio.com/android/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes'); 
    upvotesRef.transaction(function (current_value) { 
    return (current_value || 0) + 1; 
}); 

взяты из https://www.firebase.com/docs/web/guide/saving-data.html#section-transactions

Моя попытка в дротика:

int getMrn() { 
    var testRef = firebaseClient.child('mrn'); 
     return testRef.transaction((curVal) { 
     return curVal == null ? 1 : curVal + 1; 
     }).then((result) { 

     var snapshot = result.snapshot; 
     print(snapshot.val()); 

     }); 
} 

Правильный curVal возвращается и МРН является правильно написано в базе данных. Также печатается правильное значение.

Однако, я получаю следующее сообщение об ошибке, и я не уверен, почему:

Exception: Uncaught Error: type '_Future' is not a subtype of type 'int' of 'function result'. 
Stack Trace: 
#0  getMrn (package:epimss_db/firebase_db.dart:26:15) 
#1  onMenuItemSelected (package:epimss_lab/components/chempath/nephrology/electrolytes_rqst_form.dart:116:17) 
#2  Function.apply (dart:core-patch/function_patch.dart:28) 
#3  GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28) 
#4  invoke (package:smoke/smoke.dart:43:41) 
#5  HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19) 
#6  BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32) 
#7  _RootZone.runUnaryGuarded (dart:async/zone.dart:1093) 
#8  _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122) 
#9  BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67) 
#10  BlinkEventTarget.dispatchEvent_Callback_1 (dart:_blink:7764) 
#11  BlinkEventTarget.dispatchEvent_Callback_1_ (dart:_blink:7765) 
#12  EventTarget.dispatchEvent (dart:html:14741) 
#13  onMainActionClicked (package:html_components/menu/split_button.dart:34:23) 
#14  Function.apply (dart:core-patch/function_patch.dart:28) 
#15  GeneratedObjectAccessorService.invoke (package:smoke/static.dart:149:28) 
#16  invoke (package:smoke/smoke.dart:43:41) 
#17  HtmlElement&Polymer.dispatchMethod (package:polymer/src/instance.dart:1054:19) 
#18  BindingDelegate&PolymerEventBindings.getEventHandler.<anonymous closure> (package:polymer/src/events.dart:82:32) 
#19  _RootZone.runUnaryGuarded (dart:async/zone.dart:1093) 
#20  _RootZone.bindUnaryCallback.<anonymous closure> (dart:async/zone.dart:1122) 
#21  BindingDelegate&PolymerEventBindings.prepareEventBinding.<anonymous closure>.<anonymous closure> (package:polymer/src/events.dart:101:67) 

1 

Благодаря

ответ

2
Future<int> getMrn() { // <== 3 
    var testRef = firebaseClient.child('mrn'); 
     return testRef.transaction((curVal) { // <== 2) 
     return curVal == null ? 1 : curVal + 1; 
     }).then((result) { 
     var snapshot = result.snapshot; 
     print(snapshot.val()); 
     return result; // <== 1) 
     }); 
} 

1) возвращает значение из последнего прикован then() возвращается на 2) 3) Поскольку это асинхронный код, возвращается Future<int> вместо int.

Вы называете этот код, как

getMrn().then((result) { 
    // doSomething with the code here 
}); 

или с ждать

void someFunc() async { // <== async necessary in order to be able to use await 
    var result = await getMrn(); 
} 
+0

Спасибо Гюнтер. Первый вызов работает, но результат var = ждет getMrn(); говорит. выражение ожидания может использоваться только в функции, помеченной как async или async *. Я загляну в дротик асинк. –

+0

Хорошо, вам нужно добавить 'async' в функцию, в которой вы используете' await'. Я обновил свой ответ. –

+0

См. Https://langtour-dot-dart-lang.appspot.com/docs/dart-up-and-running/ch02.html#asynchrony –

Смежные вопросы