Line data Source code
1 : import 'package:flutter/material.dart';
2 : import 'package:widgetbook/src/providers/device_state.dart';
3 : import 'package:widgetbook/src/providers/provider.dart';
4 : import 'package:widgetbook/widgetbook.dart';
5 :
6 : class DeviceBuilder extends StatefulWidget {
7 1 : const DeviceBuilder({
8 : Key? key,
9 : required this.child,
10 : required this.availableDevices,
11 : required this.currentDevice,
12 1 : }) : super(key: key);
13 :
14 : final Widget child;
15 : final List<Device> availableDevices;
16 : final Device currentDevice;
17 :
18 1 : @override
19 1 : _DeviceBuilderState createState() => _DeviceBuilderState();
20 : }
21 :
22 : class _DeviceBuilderState extends State<DeviceBuilder> {
23 : late DeviceState state;
24 :
25 1 : @override
26 : void initState() {
27 2 : state = DeviceState(
28 2 : availableDevices: widget.availableDevices,
29 2 : currentDevice: widget.currentDevice,
30 : );
31 1 : super.initState();
32 : }
33 :
34 1 : @override
35 : Widget build(BuildContext context) {
36 1 : return DeviceProvider(
37 1 : state: state,
38 1 : onStateChanged: (DeviceState state) {
39 2 : setState(() {
40 1 : this.state = state;
41 : });
42 : },
43 2 : child: widget.child,
44 : );
45 : }
46 : }
47 :
48 : class DeviceProvider extends Provider<DeviceState> {
49 2 : const DeviceProvider({
50 : required DeviceState state,
51 : required ValueChanged<DeviceState> onStateChanged,
52 : required Widget child,
53 : Key? key,
54 2 : }) : super(
55 : state: state,
56 : onStateChanged: onStateChanged,
57 : child: child,
58 : key: key,
59 : );
60 :
61 2 : static DeviceProvider? of(BuildContext context) {
62 2 : return context.dependOnInheritedWidgetOfExactType<DeviceProvider>();
63 : }
64 :
65 1 : void update(List<Device> devices) {
66 1 : if (devices.isEmpty) {
67 1 : throw ArgumentError.value(
68 : devices,
69 : 'update',
70 : 'Cannot be empty',
71 : );
72 : }
73 :
74 1 : emit(
75 1 : DeviceState(
76 : availableDevices: devices,
77 1 : currentDevice: devices.first,
78 : ),
79 : );
80 : }
81 :
82 1 : void selectDevice(Device device) {
83 1 : emit(
84 1 : DeviceState(
85 2 : availableDevices: state.availableDevices,
86 : currentDevice: device,
87 : ),
88 : );
89 : }
90 :
91 1 : void nextDevice() {
92 5 : final index = state.availableDevices.indexOf(state.currentDevice);
93 5 : final nextIndex = (index + 1) % state.availableDevices.length;
94 3 : final nextDevice = state.availableDevices[nextIndex];
95 1 : emit(
96 1 : DeviceState(
97 2 : availableDevices: state.availableDevices,
98 : currentDevice: nextDevice,
99 : ),
100 : );
101 : }
102 :
103 1 : void previousDevice() {
104 5 : final index = state.availableDevices.indexOf(state.currentDevice);
105 : final previousIndex =
106 6 : index == 0 ? state.availableDevices.length - 1 : index - 1;
107 3 : final previousDevice = state.availableDevices[previousIndex];
108 1 : emit(
109 1 : DeviceState(
110 2 : availableDevices: state.availableDevices,
111 : currentDevice: previousDevice,
112 : ),
113 : );
114 : }
115 : }
|