Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Add support for saving settings in fitness app #691

Merged
merged 2 commits into from
Aug 20, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 45 additions & 13 deletions examples/fitness/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,23 @@ part 'meal.dart';
part 'measurement.dart';
part 'settings.dart';

class UserData {
abstract class UserData {
BackupMode get backupMode;
List<FitnessItem> get items;
}

class UserDataImpl extends UserData {
UserDataImpl();

List<FitnessItem> _items = [];

BackupMode _backupMode;
BackupMode get backupMode => _backupMode;
void setBackupModeAndSave(BackupMode value) {
_backupMode = value;
save();
}

List<FitnessItem> get items => _items;
void set items(List<FitnessItem> newItems) {
_items = [];
Expand All @@ -45,24 +59,40 @@ class UserData {
save();
}

Future save() => saveFitnessData(_items);
Future save() => saveFitnessData(this);

UserDataImpl.fromJson(Map json) {
json['items'].forEach((item) {
_items.add(new Measurement.fromJson(item));
});
try {
_backupMode = BackupMode.values.firstWhere((BackupMode mode) {
return mode.toString() == json['backupMode'];
});
} catch(e) {
print("Failed to load backup mode: ${e}");
}
}

Map toJson() {
Map json = new Map();
json['items'] = _items.map((item) => item.toJson()).toList();
json['backupMode'] = _backupMode.toString();
return json;
}
}

class FitnessApp extends App {
NavigationState _navigationState;
final UserData _userData = new UserData();
UserDataImpl _userData = new UserDataImpl();

void didMount() {
super.didMount();
loadFitnessData().then((List<Measurement> list) {
setState(() => _userData.items = list);
loadFitnessData().then((UserData data) {
setState(() => _userData = data);
}).catchError((e) => print("Failed to load data: $e"));
}

void save() {
_userData.save().catchError((e) => print("Failed to load data: $e"));
}

void initState() {
_navigationState = new NavigationState([
new Route(
Expand Down Expand Up @@ -90,7 +120,11 @@ class FitnessApp extends App {
),
new Route(
name: '/settings',
builder: (navigator, route) => new SettingsFragment(navigator, backupSetting, settingsUpdater)
builder: (navigator, route) => new SettingsFragment(
navigator: navigator,
userData: _userData as UserData,
updater: settingsUpdater
)
),
]);
super.initState();
Expand All @@ -112,12 +146,10 @@ class FitnessApp extends App {
setState(() => _userData.removeAndSave(item));
}

BackupMode backupSetting = BackupMode.disabled;

void settingsUpdater({ BackupMode backup }) {
setState(() {
if (backup != null)
backupSetting = backup;
_userData.setBackupModeAndSave(backup);
});
}

Expand Down
8 changes: 4 additions & 4 deletions examples/fitness/lib/settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ typedef void SettingsUpdater({

class SettingsFragment extends Component {

SettingsFragment(this.navigator, this.backup, this.updater);
SettingsFragment({ this.navigator, this.userData, this.updater });

final Navigator navigator;
final BackupMode backup;
final UserData userData;
final SettingsUpdater updater;

void _handleBackupChanged(bool value) {
Expand All @@ -38,10 +38,10 @@ class SettingsFragment extends Component {
padding: const EdgeDims.symmetric(vertical: 20.0),
child: new Block([
new DrawerItem(
onPressed: () { _handleBackupChanged(!(backup == BackupMode.enabled)); },
onPressed: () { _handleBackupChanged(!(userData.backupMode == BackupMode.enabled)); },
children: [
new Flexible(child: new Text('Back up data to the cloud')),
new Switch(value: backup == BackupMode.enabled, onChanged: _handleBackupChanged)
new Switch(value: userData.backupMode == BackupMode.enabled, onChanged: _handleBackupChanged)
]
)
])
Expand Down
12 changes: 4 additions & 8 deletions examples/fitness/lib/user_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,16 @@ Future<String> dataFilePath() async {
return cachedDataFilePath;
}

Future<List<Measurement>> loadFitnessData() async {
List<Measurement> items = [];
Future<UserData> loadFitnessData() async {
String dataPath = await dataFilePath();
print("Loading from $dataPath");
JsonDecoder decoder = new JsonDecoder();
var data = await decoder.convert(await new File(dataPath).readAsString());
data.forEach((item) {
items.add(new Measurement.fromJson(item));
});
return items;
Map data = await decoder.convert(await new File(dataPath).readAsString());
return new UserDataImpl.fromJson(data);
}

// Intentionally synchronous for execution just before shutdown.
Future saveFitnessData(List<Measurement> data) async {
Future saveFitnessData(UserDataImpl data) async {
String dataPath = await dataFilePath();
print("Saving to $dataPath");
JsonEncoder encoder = new JsonEncoder();
Expand Down