Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: replace null device with NoneDevice #854

Merged
merged 2 commits into from
Aug 18, 2023
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/widgetbook/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
## Unreleased

- **BREAKING**: `DeviceFrameAddon.devices` is no longer nullable, in favor of the new `NoneDevice`. ([#854](https://github.com/widgetbook/widgetbook/pull/854))
- **REFACTOR**: Support Flutter 3.13.0. ([#847](https://github.com/widgetbook/widgetbook/pull/847))
- **REFACTOR**: Update `DropdownMenu` theme. ([#844](https://github.com/widgetbook/widgetbook/pull/844))
- **REFACTOR**: Make `appBuilder` optional. ([#843](https://github.com/widgetbook/widgetbook/pull/843))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ export 'package:device_frame/device_frame.dart';

export 'device_frame_addon.dart';
export 'device_frame_setting.dart';
export 'none_device.dart';
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ import 'package:flutter/material.dart';
import '../../fields/fields.dart';
import '../common/common.dart';
import 'device_frame_setting.dart';
import 'none_device.dart';

/// A [WidgetbookAddon] for changing the active device/frame. It's based on
/// the [`device_frame`](https://pub.dev/packages/device_frame) package.
class DeviceFrameAddon extends WidgetbookAddon<DeviceFrameSetting> {
DeviceFrameAddon({
required List<DeviceInfo?> devices,
required List<DeviceInfo> devices,
DeviceInfo? initialDevice,
}) : assert(
devices.isNotEmpty,
Expand All @@ -19,24 +20,24 @@ class DeviceFrameAddon extends WidgetbookAddon<DeviceFrameSetting> {
initialDevice == null || devices.contains(initialDevice),
'initialDevice must be in devices',
),
this.devices = [null, ...devices], // [null] represents a "none" device
this.devices = [NoneDevice.instance, ...devices],
super(
name: 'Device',
initialSetting: DeviceFrameSetting(
device: initialDevice,
device: initialDevice ?? NoneDevice.instance,
),
);

final List<DeviceInfo?> devices;
final List<DeviceInfo> devices;

@override
List<Field> get fields {
return [
ListField<DeviceInfo?>(
ListField<DeviceInfo>(
name: 'name',
values: devices,
initialValue: initialSetting.device,
labelBuilder: (device) => device?.name ?? 'None',
labelBuilder: (device) => device.name,
),
ListField<Orientation>(
name: 'orientation',
Expand All @@ -58,7 +59,7 @@ class DeviceFrameAddon extends WidgetbookAddon<DeviceFrameSetting> {
@override
DeviceFrameSetting valueFromQueryGroup(Map<String, String> group) {
return DeviceFrameSetting(
device: valueOf<DeviceInfo?>('name', group),
device: valueOf('name', group)!,
orientation: valueOf('orientation', group)!,
hasFrame: valueOf('frame', group)!,
);
Expand All @@ -70,15 +71,15 @@ class DeviceFrameAddon extends WidgetbookAddon<DeviceFrameSetting> {
Widget child,
DeviceFrameSetting setting,
) {
if (setting.device == null) {
if (setting.device is NoneDevice) {
return child;
}

return Padding(
padding: const EdgeInsets.all(32),
child: DeviceFrame(
orientation: setting.orientation,
device: setting.device!,
device: setting.device,
isFrameVisible: setting.hasFrame,
screen: setting.hasFrame
? child
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class DeviceFrameSetting {
this.hasFrame = true,
});

final DeviceInfo? device;
final DeviceInfo device;
final Orientation orientation;
final bool hasFrame;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import 'package:device_frame/device_frame.dart';
import 'package:flutter/widgets.dart';

class NoneDevice implements DeviceInfo {
const NoneDevice._();

static const NoneDevice instance = NoneDevice._();

@override
String get name => 'None';

@override
DeviceIdentifier get identifier => throw UnimplementedError();

@override
Size get frameSize => throw UnimplementedError();

@override
Size get screenSize => throw UnimplementedError();

@override
double get pixelRatio => throw UnimplementedError();

@override
EdgeInsets? get rotatedSafeAreas => throw UnimplementedError();

@override
EdgeInsets get safeAreas => throw UnimplementedError();

@override
Path get screenPath => throw UnimplementedError();

@override
$DeviceInfoCopyWith<DeviceInfo> get copyWith => throw UnimplementedError();

@override
CustomPainter get framePainter => throw UnimplementedError();
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,12 @@ void main() {

test(
'given a device frame setting, '
'when device is null, '
'when device is $NoneDevice, '
'then [buildUseCase] returns child as-is',
() {
const child = Text('child');
final setting = DeviceFrameSetting(
device: null,
device: NoneDevice.instance,
);

final result = addon.buildUseCase(
Expand Down