Skip to content

Commit

Permalink
feat(trait_detail_screen): use PowerProvider to view state and perfor…
Browse files Browse the repository at this point in the history
…m actions on device
  • Loading branch information
ses110 committed Dec 10, 2021
1 parent 1a8e613 commit 9a65169
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 20 deletions.
2 changes: 1 addition & 1 deletion lib/providers/power_trait_provider.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:flutter/widgets.dart';
import 'package:yonomi_device_widgets/devices/trait_based_device_screen.dart';
import 'package:yonomi_device_widgets/traits/trait_based_device_screen.dart';
import 'package:yonomi_platform_sdk/yonomi-sdk.dart';

typedef GetDeviceDetailsMethod = Future<Device> Function(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:yonomi_device_widgets/providers/power_trait_provider.dart';
import 'package:yonomi_device_widgets/providers/trait_based_device_notifier.dart';
import 'package:yonomi_platform_sdk/yonomi-sdk.dart';
import 'package:yonomi_platform_sdk/yonomi-sdk.dart' as yoSdk;
Expand All @@ -8,9 +9,11 @@ class TraitBasedDetailScreen extends StatelessWidget {
final Request request;
final String deviceId;

const TraitBasedDetailScreen(
{Key? key, required this.request, required this.deviceId})
: super(key: key);
const TraitBasedDetailScreen({
Key? key,
required this.request,
required this.deviceId,
}) : super(key: key);

@override
Widget build(BuildContext context) {
Expand All @@ -21,7 +24,7 @@ class TraitBasedDetailScreen extends StatelessWidget {
if (traitBasedDeviceNotifier.isLoading) {
return CircularProgressIndicator();
} else {
return TraitWidgetsBuilder.build(
return TraitWidgetsBuilder.build(this.request, this.deviceId,
traitBasedDeviceNotifier.deviceDetail!);
}
}),
Expand All @@ -38,7 +41,7 @@ class PowerTrait extends Trait {
}

class TraitWidgetsBuilder {
static Widget build(Device deviceDetail) {
static Widget build(Request req, String deviceId, Device deviceDetail) {
List<Trait> dummyTraits = [
LockTrait("whenLocked", IsLocked(true)),
LockTrait("whenUnlocked", IsLocked(false)),
Expand All @@ -50,7 +53,7 @@ class TraitWidgetsBuilder {
return Column(
children: [
buildDeviceTitleRow(deviceDetail.displayName),
...buildTraitRows(dummyTraits),
...buildTraitRows(req, deviceId, dummyTraits),
],
);
}
Expand All @@ -61,24 +64,25 @@ class TraitWidgetsBuilder {
);
}

static List<Row> buildTraitRows(List<Trait> traits) {
static List<Row> buildTraitRows(
Request request, String deviceId, List<Trait> traits) {
List<Row> traitRows = [];
for (var trait in traits) {
traitRows.add(
Row(
children: [traitFactory(trait)],
children: [traitFactory(request, deviceId, trait)],
),
);
}
return traitRows;
}

static Widget traitFactory(Trait trait) {
static Widget traitFactory(Request req, String deviceId, Trait trait) {
switch (trait.runtimeType) {
case LockTrait:
return LockTraitWidget(trait);
case PowerTrait:
return PowerTraitWidget(trait);
return PowerTraitWidget(req, deviceId, trait);
default:
return UnknownTraitWidget(trait);
}
Expand All @@ -99,17 +103,32 @@ class LockTraitWidget extends StatelessWidget {
class PowerTraitWidget extends StatelessWidget {
final Trait trait;

PowerTraitWidget(this.trait);
final Request request;

final String deviceId;

const PowerTraitWidget(this.request, this.deviceId, this.trait);

@override
Widget build(BuildContext context) {
return Text("Power Trait: ${this.trait.name}");
// return Switch(
// value: false,
// onChanged: (bool newValue) {
// print("Switched ${newValue}");
// },
// );
return ChangeNotifierProvider(
create: (_) => PowerTraitProvider(request, deviceId),
child: Consumer<PowerTraitProvider>(
builder: (_, powerDeviceNotifier, child) {
if (powerDeviceNotifier.isLoading ||
powerDeviceNotifier.isPerformingAction) {
return CircularProgressIndicator();
} else {
return Switch(
value: powerDeviceNotifier.getPowerTrait()?.state.value ?? false,
onChanged: (bool newValue) {
print("Power Switch value set to: ${newValue}");
powerDeviceNotifier.sendPowerOnOffAction(newValue);
},
);
}
}),
);
}
}

Expand Down
2 changes: 1 addition & 1 deletion test/providers/power_trait_provider_test.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:yonomi_device_widgets/devices/trait_based_device_screen.dart';
import 'package:yonomi_device_widgets/providers/power_trait_provider.dart';
import 'package:yonomi_device_widgets/traits/trait_based_device_screen.dart';
import 'package:yonomi_platform_sdk/third_party/yonomi_graphql_schema/schema.docs.schema.gql.dart';
import 'package:yonomi_platform_sdk/yonomi-sdk.dart';

Expand Down

0 comments on commit 9a65169

Please sign in to comment.