Skip to content

Commit 19ab3a7

Browse files
author
wigginsp
committed
Version 1.0.4 - Added Generics
1 parent 5e80d4f commit 19ab3a7

File tree

8 files changed

+107
-66
lines changed

8 files changed

+107
-66
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## 1.0.4
2+
3+
Bug fix for get all items
4+
Can now pin/unpin/fromPin for all ParseObjects
5+
Now supports generics
6+
Cody tidy around extending
7+
18
## 1.0.3
29

310
Added persistent storage. When a logged in user closes the app, then reopens, the data

example/lib/diet_plan.dart

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
1+
import 'dart:convert';
12
import 'dart:core';
23

34
import 'package:parse_server_sdk/parse.dart';
45

56
class DietPlan extends ParseObject {
67
DietPlan() : super(DIET_PLAN);
78

8-
String name;
9-
String description;
10-
num protein;
11-
num carbs;
12-
num fat;
13-
num status;
14-
159
static const String DIET_PLAN = 'Diet_Plans';
1610
static const String NAME = 'Name';
1711
static const String DESCRIPTION = 'Description';
@@ -20,26 +14,30 @@ class DietPlan extends ParseObject {
2014
static const String FAT = 'Fat';
2115
static const String STATUS = 'Status';
2216

17+
String get name => get<String>(NAME);
18+
set name(String name) => set<String>(NAME, name);
19+
20+
String get description => get<String>(DESCRIPTION);
21+
set description(String description) => set<String>(DESCRIPTION, name);
22+
23+
int get protein => get<int>(PROTEIN);
24+
set protein(int protein) => super.set<int>(PROTEIN, protein);
25+
26+
int get carbs => get<int>(CARBS);
27+
set carbs(int carbs) => set<int>(CARBS, carbs);
28+
29+
int get fat => get<int>(FAT);
30+
set fat(int fat) => set<int>(FAT, fat);
31+
32+
int get status => get<int>(STATUS);
33+
set status(int status) => set<int>(STATUS, status);
34+
2335
@override
24-
dynamic fromJson(Map objectData) {
25-
this.name = objectData[NAME];
26-
this.description = objectData[DESCRIPTION];
27-
this.protein = objectData[PROTEIN];
28-
this.carbs = objectData[CARBS];
29-
this.fat = objectData[FAT];
30-
this.status = objectData[STATUS];
36+
fromJson(Map objectData) {
37+
super.setObjectData(objectData);
3138
return this;
3239
}
3340

34-
Map<String, dynamic> toJson() => {
35-
NAME: name,
36-
DESCRIPTION: description,
37-
PROTEIN: protein,
38-
CARBS: carbs,
39-
FAT: fat,
40-
STATUS: status,
41-
};
42-
4341
@override
4442
String toString() {
4543
return toJson().toString();

example/lib/main.dart

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,22 @@ class _MyAppState extends State<MyApp> {
7878
var response = await DietPlan().getObject('R5EonpUDWy');
7979

8080
if (response.success) {
81-
print(ApplicationConstants.APP_NAME + ": " + (response.result as DietPlan).toString());
81+
var dietPlan = (response.result as DietPlan);
82+
83+
// Shows example of storing values in their proper type and retrieving them
84+
dietPlan.set<int>('RandomInt', 8);
85+
var randomInt = dietPlan.get<int>('RandomInt');
86+
87+
if (randomInt is int) print('Saving generic value worked!');
88+
89+
// Shows example of pinning an item
90+
dietPlan.pin();
91+
92+
// shows example of retrieving a pin
93+
var newDietPlanFromPin = DietPlan().fromPin('R5EonpUDWy');
94+
95+
if (newDietPlanFromPin != null) print('Saving generic value worked!');
96+
8297
} else {
8398
print(ApplicationConstants.APP_NAME + ": " + response.error.message);
8499
}

lib/src/network/parse_http_client.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ part of flutter_parse_sdk;
33
/// Creates a custom version of HTTP Client that has Parse Data Preset
44
class ParseHTTPClient extends BaseClient {
55
final Client _client = Client();
6-
final String _userAgent = "Flutter Parse SDK 1.0.3";
6+
final String _userAgent = "Flutter Parse SDK 1.0.4";
77
ParseCoreData data = ParseCoreData();
88

99
ParseHTTPClient();

lib/src/objects/parse_base.dart

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,50 +5,54 @@ abstract class ParseBase {
55
Map _objectData = Map<String, dynamic>();
66

77
/// Returns [String] objectId
8-
String get objectId => _objectData['objectId'];
9-
set objectId(String objectId) => _objectData[objectId];
8+
String get objectId => get<String>(OBJECT_ID);
9+
set objectId(String objectId) => set<String>(OBJECT_ID, objectId);
1010

1111
/// Returns [DateTime] createdAt
12-
DateTime get createdAt => stringToDateTime(_objectData['createdAt']);
13-
set createdAt(DateTime createdAt) =>
14-
_objectData['createdAt'] = dateTimeToString(createdAt);
12+
DateTime get createdAt => stringToDateTime(get<String>(CREATED_AT));
13+
set createdAt(DateTime createdAt) => set<String>(CREATED_AT, dateTimeToString(createdAt));
1514

1615
/// Returns [DateTime] updatedAt
17-
DateTime get updatedAt => stringToDateTime(_objectData['updatedAt']);
18-
set updatedAt(DateTime updatedAt) =>
19-
_objectData['updatedAt'] = dateTimeToString(updatedAt);
16+
DateTime get updatedAt => stringToDateTime(get<String>(UPDATED_AT));
17+
set updatedAt(DateTime updatedAt) => set<String>(UPDATED_AT, dateTimeToString(updatedAt));
2018

2119
/// Converts object to [String] in JSON format
22-
@protected
23-
toJson() => JsonEncoder().convert(getObjectData());
20+
@protected String toJson() {
21+
return JsonEncoder().convert(getObjectData());
22+
}
2423

2524
/// Creates a copy of this class
2625
@protected
27-
copy() => JsonDecoder().convert(fromJson(getObjectData()));
26+
copy() => fromJson(JsonDecoder().convert(toJson()));
2827

2928
/// Sets all the objects variables
3029
@protected
31-
setObjectData(Map objectData) => _objectData = objectData;
30+
setObjectData(Map objectData) {
31+
_objectData = objectData;
32+
}
3233

3334
/// Returns the objects variables
3435
@protected
35-
getObjectData() => _objectData;
36+
getObjectData() {
37+
return _objectData;
38+
}
3639

3740
/// Saves in storage
3841
@protected
3942
saveInStorage(String key) async {
4043
await ParseCoreData().getStore().setString(key, toJson());
4144
}
4245

43-
@protected
44-
fromJson(Map objectData) {
45-
if (_objectData == null) _objectData = Map();
46-
_objectData.addAll(objectData);
47-
}
46+
/// Needs overriding to create deep copy affect
47+
@override
48+
fromJson(Map objectData) {}
4849

49-
/// Create a new variable for this object, [bool] forceUpdate is always true,
50-
/// if unsure as to whether an item is needed or not, set to false
51-
set(String key, dynamic value, {bool forceUpdate: true}) {
50+
/// Sets type [T] from objectData
51+
///
52+
/// To set an int, call setType<int> and an int will be saved
53+
/// [bool] forceUpdate is always true, if unsure as to whether an item is
54+
/// needed or not, set to false
55+
set<T>(String key, T value, {bool forceUpdate: true}) {
5256
if (value != null) {
5357
if (getObjectData().containsKey(key)) {
5458
if (forceUpdate) getObjectData()[key] = value;
@@ -58,10 +62,18 @@ abstract class ParseBase {
5862
}
5963
}
6064

61-
/// Returns a variable from the objectData
62-
get(String key, {dynamic defaultValue, bool fromServer}) {
65+
/// Gets type [T] from objectData
66+
///
67+
/// Returns null or [defaultValue] if provided. To get an int, call
68+
/// getType<int> and an int will be returned, null, or a defaultValue if
69+
/// provided
70+
get<T>(String key, {T defaultValue}) {
6371
if (getObjectData().containsKey(key)) {
64-
return getObjectData()[key];
72+
if (T != null && getObjectData()[key] is T) {
73+
return getObjectData()[key] as T;
74+
} else {
75+
return getObjectData()[key];
76+
}
6577
} else {
6678
return defaultValue;
6779
}
@@ -72,7 +84,8 @@ abstract class ParseBase {
7284
/// Replicates Android SDK pin process and saves object to storage
7385
pin() async {
7486
if (objectId != null) {
75-
await ParseCoreData().getStore().setString(objectId, toJson());
87+
var itemToSave = toJson();
88+
await ParseCoreData().getStore().setString(objectId, itemToSave);
7689
return true;
7790
} else {
7891
return false;
@@ -84,8 +97,9 @@ abstract class ParseBase {
8497
/// Replicates Android SDK pin process and saves object to storage
8598
unpin() async {
8699
if (objectId != null) {
87-
var itemToSave = await ParseCoreData().getStore().setString(objectId, null);
88-
return true;
100+
var itemToSave = await ParseCoreData().getStore().setString(
101+
objectId, null);
102+
if (itemToSave) return true;
89103
} else {
90104
return false;
91105
}
@@ -94,9 +108,9 @@ abstract class ParseBase {
94108
/// Saves item to simple key pair value storage
95109
///
96110
/// Replicates Android SDK pin process and saves object to storage
97-
fromPin() async {
111+
fromPin(String objectId) {
98112
if (objectId != null) {
99-
var itemFromStore = await ParseCoreData().getStore().getString(objectId);
113+
var itemFromStore = ParseCoreData().getStore().getString(objectId);
100114

101115
if (itemFromStore != null) {
102116
Map<String, dynamic> itemFromStoreMap = JsonDecoder().convert(

lib/src/objects/parse_response.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,15 @@ class ParseResponse {
7272
var resultsList = List();
7373

7474
for (var value in map) {
75-
resultsList.add(_handleSingleResult(object, value));
75+
var newObject = _handleSingleResult(object, value);
76+
resultsList.add(newObject);
7677
}
7778

7879
return resultsList;
7980
}
8081

8182
/// Handles a response with a single result object
8283
static _handleSingleResult(ParseBase object, map) {
83-
populateObjectBaseData(object, map);
8484
return object.fromJson(map);
8585
}
8686
}

lib/src/objects/parse_user.dart

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,17 @@ class ParseUser extends ParseBase {
66
bool _debug;
77
ParseHTTPClient _client;
88

9-
String acl;
10-
String username;
11-
String password;
12-
String emailAddress;
9+
Map get acl => super.get<Map>(ACL);
10+
set acl(Map acl) => set<Map>(ACL, acl);
11+
12+
String get username => super.get<String>(USERNAME);
13+
set username(String username) => set<String>(USERNAME, username);
14+
15+
String get password => super.get<String>(PASSWORD);
16+
set password(String password) => set<String>(PASSWORD, password);
17+
18+
String get emailAddress => super.get<String>(EMAIL);
19+
set emailAddress(String emailAddress) => set<String>(EMAIL, emailAddress);
1320

1421
/// Creates an instance of ParseUser
1522
///
@@ -21,9 +28,13 @@ class ParseUser extends ParseBase {
2128
/// Requires [String] username, [String] password. [String] email address
2229
/// is required as well to create a full new user object on ParseServer. Only
2330
/// username and password is required to login
24-
ParseUser(this.username, this.password, this.emailAddress, {bool debug, ParseHTTPClient client}) : super() {
31+
ParseUser(String username, String password, String emailAddress, {bool debug, ParseHTTPClient client}) : super() {
2532
client == null ? _client = ParseHTTPClient() : _client = client;
2633
_debug = isDebugEnabled(client, objectLevelDebug: debug);
34+
35+
this.username = username;
36+
this.password = password;
37+
this.emailAddress = emailAddress;
2738
}
2839

2940
/// Returns a [User] from a [Map] object
@@ -37,10 +48,6 @@ class ParseUser extends ParseBase {
3748
objectId = getObjectData()[OBJECT_ID];
3849
createdAt = stringToDateTime(getObjectData()[CREATED_AT]);
3950
updatedAt = stringToDateTime(getObjectData()[UPDATED_AT]);
40-
acl = getObjectData()[ACL].toString();
41-
username = getObjectData()[USERNAME];
42-
password = getObjectData()[PASSWORD];
43-
emailAddress = getObjectData()[EMAIL];
4451

4552
if (updatedAt == null) updatedAt = createdAt;
4653

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: parse_server_sdk
22
description: Flutter plugin for Parse Server, (https://parseplatform.org), (https://back4app.com)
3-
version: 1.0.3
3+
version: 1.0.4
44
homepage: https://github.com/phillwiggins/flutter_parse_sdk
55
author: PhillWiggins <phill.wiggins@gmail.com>
66

0 commit comments

Comments
 (0)