Неправильный decode() из redstone_mapper о наблюдаемом объекте в веб-приложении
У меня есть разные результаты использования decode() из redstone.dart с объектом, который имеет наблюдаемые поля в консоли и веб-приложениях.
В моем консольном приложении естьpubspec.yaml
name: 'redstone_decode'
version: 0.0.1
description: console app
environment:
sdk: '>=1.0.0 <2.0.0'
dependencies:
redstone: any
redstone_mapper: any
observe: any
transformers:
- redstone_mapper # http://redstonedart.org/doc/redstone_mapper.html
- observe:
entry_points: bin/main.dart
main.dart
import 'dart:convert' show JSON;
import 'package:redstone_mapper/mapper.dart';
import 'package:redstone_mapper/mapper_factory.dart';
import 'package:observe/observe.dart';
class User extends Object with Observable {
@Field()
@observable
String username;
@observable
@Field()
String password;
}
void main() {
bootstrapMapper();
User user = new User()
..username = "user"
..password = "pass";
String userJson = JSON.encode(encode(user));
User user1 = decode({
"username":"user",
"password":"pass",
"ERROR":"error"}, User);
String userJson1 = JSON.encode(encode(user1));
print(' after decode() '+ userJson1);
}
И это работает правильно. Результат в консоли:
after decode() {"username":"user","password":"pass"}
Я сделал веб-приложение из шаблона "Абсолютно голое веб-приложение". Имеет pubspec.yaml
name: 'redstone_decode'
version: 0.0.1
description: An absolute bare-bones web app.
environment:
sdk: '>=1.0.0 <2.0.0'
dependencies:
browser: '>=0.10.0 <0.11.0'
redstone: any
redstone_mapper: any
observe: any
transformers:
#- redstone_mapper http://redstonedart.org/doc/redstone_mapper.html
- observe:
entry_points: web/index.html
entry_points: web/main.dart
main.dart
import "dart:html";
import 'dart:convert' show JSON;
import 'package:redstone_mapper/mapper.dart';
import 'package:redstone_mapper/mapper_factory.dart';
import 'package:observe/observe.dart';
class User extends Object with Observable {
@Field()
@observable
String username;
@observable
@Field()
String password;
}
void main() {
bootstrapMapper();
User user = new User()
..username = "user"
..password = "pass";
String userJson = JSON.encode(encode(user));
User user1 = decode({
"username":"user",
"password":"pass",
"ERROR":"error"}, User);
String userJson1 = JSON.encode(encode(user1));
querySelector('#output').text = ' after decode() '+ userJson1;
}
Результат в Dartium
after decode() {}
Есть идеи?
1 ответ
Наблюдающий трансформатор перепишет название поля в __$FieldName
, простой член поля станет установщиком / получателем. Только добытчик должен держать @Field()
аннотация..., так decode
Функция не удастся.
Обходной путь, создайте базовый класс, чтобы сохранить исходное имя поля:
import 'package:redstone_mapper/mapper.dart';
import 'package:redstone_mapper/mapper_factory.dart';
import 'package:observe/observe.dart';
class BaseUser {
@Field()
String username;
@Field()
String password;
}
class User extends BaseUser implements Observable {
@Field()
@observable
String username;
@Field()
@observable
String password;
toString() => 'User("$username", "$password");';
}
void main() {
bootstrapMapper();
User user = new User()
..username = "user"
..password = "pass";
String userJson = encodeJson(user);
print('$userJson');
User userDes1 = decodeJson('{"username":"user","password":"pass"}', User);
User userDes2 = decode({"username":"user","password":"pass"}, User);
print(userDes1); // User("user", "pass");
print(userDes2); // User("user", "pass");
}