-
Notifications
You must be signed in to change notification settings - Fork 171
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix stuff
- Loading branch information
Showing
71 changed files
with
1,327 additions
and
2,293 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,37 +1,88 @@ | ||
import 'package:flutter/widgets.dart'; | ||
import 'package:nested/nested.dart'; | ||
import 'package:flutter/material.dart'; | ||
import 'package:provider/provider.dart'; | ||
import 'package:widgetbook/src/navigation/router.dart'; | ||
import 'package:widgetbook/widgetbook.dart'; | ||
|
||
class WidgetbookAddOn { | ||
const WidgetbookAddOn({ | ||
abstract class WidgetbookAddOnModel { | ||
const WidgetbookAddOnModel(); | ||
|
||
/// Required to allow proper deep linking including AddOn property selection | ||
/// | ||
/// Defaults to an empty Map, which means no query parameters are set for the | ||
/// route | ||
Map<String, String> toQueryParameter() { | ||
return {}; | ||
} | ||
} | ||
|
||
/// A class that can be used to extend the selection of Widgetbook properties. | ||
/// | ||
/// See also: | ||
/// | ||
/// * [ThemeAddon], a generic implementation of a [WidgetbookAddOn]. | ||
/// * [MaterialThemeAddon], an [WidgetbookAddOn] to change the active | ||
/// [ThemeData] of the [WidgetbookUseCase]. | ||
/// * [FrameAddon], an [WidgetbookAddOn] to change the active [Frame] that | ||
/// allows to view the [WidgetbookUseCase] on different screens. | ||
/// | ||
/// You must not have multiple [WidgetbookAddOn]s that are of the same generic | ||
/// type | ||
abstract class WidgetbookAddOn<T extends WidgetbookAddOnModel> { | ||
WidgetbookAddOn({ | ||
required this.name, | ||
required this.wrapperBuilder, | ||
required this.builder, | ||
required this.providerBuilder, | ||
required this.getQueryParameter, | ||
}); | ||
required this.setting, | ||
}) : provider = ValueNotifier<T>(setting); | ||
|
||
final String name; | ||
final T setting; | ||
late ValueNotifier<T> provider; | ||
|
||
final Widget Function( | ||
BuildContext context, | ||
Map<String, dynamic> routerData, | ||
Widget child, | ||
) wrapperBuilder; | ||
/// Allows for parsing of [queryParameters] by using information from the | ||
/// router and from the initially provided [setting]. | ||
/// | ||
/// If no [queryParameters] are available, return [setting]. | ||
/// If [queryParameters] are avaialbe return a propert `Setting` object. | ||
/// | ||
/// If not overriden, returns the initially provided [setting]. | ||
T settingFromQueryParameters({ | ||
required Map<String, String> queryParameters, | ||
required T setting, | ||
}) { | ||
return setting; | ||
} | ||
|
||
final Widget Function( | ||
BuildContext context, | ||
) builder; | ||
T get value => provider.value; | ||
|
||
void onChanged(BuildContext context, T value) { | ||
provider.value = value; | ||
context.goTo(queryParams: value.toQueryParameter()); | ||
} | ||
|
||
final SingleChildWidget Function( | ||
Widget buildProvider( | ||
BuildContext context, | ||
) providerBuilder; | ||
Map<String, String> queryParameters, | ||
Widget child, | ||
) { | ||
final initialData = settingFromQueryParameters( | ||
queryParameters: queryParameters, | ||
setting: setting, | ||
); | ||
provider = ValueNotifier<T>(initialData); | ||
|
||
final Map<String, String> Function(BuildContext context) getQueryParameter; | ||
return ChangeNotifierProvider.value( | ||
key: ValueKey(initialData), | ||
value: provider, | ||
child: child, | ||
); | ||
} | ||
|
||
@override | ||
bool operator ==(Object other) => | ||
other is WidgetbookAddOn && name == other.name; | ||
Widget build( | ||
BuildContext context, | ||
); | ||
} | ||
|
||
@override | ||
int get hashCode => name.hashCode; | ||
extension AddonExtension on BuildContext { | ||
T? getAddonValue<T extends WidgetbookAddOnModel>() { | ||
return read<ValueNotifier<T>?>()?.value; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4 changes: 2 additions & 2 deletions
4
packages/widgetbook/lib/src/addons/frame_addon/addons/addons.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
export './device_addon/device_addon.dart'; | ||
export './no_frame_addon/no_frame_addon.dart'; | ||
export 'device/device_addon.dart'; | ||
export 'no_frame/no_frame_addon.dart'; |
84 changes: 84 additions & 0 deletions
84
packages/widgetbook/lib/src/addons/frame_addon/addons/device/device_addon.dart
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
import 'package:flutter/material.dart'; | ||
import 'package:widgetbook/src/navigation/router.dart'; | ||
import 'package:widgetbook/widgetbook.dart'; | ||
import 'package:widgetbook_core/widgetbook_core.dart'; | ||
|
||
export './device_setting.dart'; | ||
|
||
class DeviceAddon extends WidgetbookAddOn<DeviceSetting> { | ||
DeviceAddon({ | ||
required super.setting, | ||
}) : super( | ||
name: 'Device', | ||
); | ||
|
||
@override | ||
DeviceSetting settingFromQueryParameters({ | ||
required Map<String, String> queryParameters, | ||
required DeviceSetting setting, | ||
}) { | ||
final activeDevice = parseQueryParameters( | ||
name: 'device', | ||
queryParameters: queryParameters, | ||
mappedData: {for (var e in setting.devices) e.name: e}, | ||
) ?? | ||
setting.activeDevice; | ||
final activeOrientation = parseQueryParameters( | ||
name: 'orientation', | ||
queryParameters: queryParameters, | ||
mappedData: { | ||
Orientation.portrait.name: Orientation.portrait, | ||
Orientation.landscape.name: Orientation.landscape, | ||
}, | ||
) ?? | ||
setting.orientation; | ||
|
||
return setting.copyWith( | ||
activeDevice: activeDevice, | ||
orientation: activeOrientation, | ||
); | ||
} | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
return Column( | ||
crossAxisAlignment: CrossAxisAlignment.start, | ||
mainAxisSize: MainAxisSize.min, | ||
children: [ | ||
SubSetting( | ||
name: '$Device', | ||
child: DropdownSetting<Device>( | ||
options: value.devices, | ||
optionValueBuilder: (device) => device.name, | ||
initialSelection: value.activeDevice, | ||
onSelected: (newActiveDevice) { | ||
onChanged(context, value.copyWith(activeDevice: newActiveDevice)); | ||
}, | ||
), | ||
), | ||
SubSetting( | ||
name: '$Orientation', | ||
child: DropdownSetting<Orientation>( | ||
options: const [ | ||
Orientation.portrait, | ||
Orientation.landscape, | ||
], | ||
optionValueBuilder: (orientation) => orientation.name, | ||
initialSelection: value.orientation, | ||
onSelected: (orientation) { | ||
onChanged(context, value.copyWith(orientation: orientation)); | ||
}, | ||
), | ||
), | ||
], | ||
); | ||
} | ||
} | ||
|
||
extension DeviceExtension on BuildContext { | ||
Device get device => getAddonValue<DeviceSetting>()!.activeDevice; | ||
} | ||
|
||
extension OrientationExtension on BuildContext { | ||
Orientation get orientation => getAddonValue<DeviceSetting>()!.orientation; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.