Line data Source code
1 : import 'package:flutter/material.dart'; 2 : import 'package:widgetbook/src/models/organizers/story.dart'; 3 : import 'package:widgetbook/src/providers/canvas_state.dart'; 4 : import 'package:widgetbook/src/providers/provider.dart'; 5 : import 'package:widgetbook/src/repositories/selected_story_repository.dart'; 6 : import 'package:widgetbook/src/repositories/story_repository.dart'; 7 : 8 : class CanvasBuilder extends StatefulWidget { 9 1 : const CanvasBuilder({ 10 : Key? key, 11 : required this.child, 12 : required this.storyRepository, 13 : required this.selectedStoryRepository, 14 1 : }) : super(key: key); 15 : 16 : final Widget child; 17 : final StoryRepository storyRepository; 18 : final SelectedStoryRepository selectedStoryRepository; 19 : 20 1 : @override 21 1 : _CanvasBuilderState createState() => _CanvasBuilderState(); 22 : } 23 : 24 : class _CanvasBuilderState extends State<CanvasBuilder> { 25 : CanvasState state = CanvasState.unselected(); 26 : late CanvasProvider provider; 27 : 28 1 : void setProvider() { 29 2 : provider = CanvasProvider( 30 2 : storyRepository: widget.storyRepository, 31 2 : selectedStoryRepository: widget.selectedStoryRepository, 32 1 : state: state, 33 1 : onStateChanged: (CanvasState state) { 34 2 : setState(() { 35 1 : this.state = state; 36 1 : setProvider(); 37 : }); 38 : }, 39 2 : child: widget.child, 40 : ); 41 : } 42 : 43 1 : @override 44 : void initState() { 45 1 : setProvider(); 46 5 : widget.storyRepository.getStreamOfItems().forEach((_) { 47 2 : provider.updateStory(); 48 : }); 49 : 50 1 : super.initState(); 51 : } 52 : 53 1 : @override 54 : Widget build(BuildContext context) { 55 1 : return provider; 56 : } 57 : } 58 : 59 : class CanvasProvider extends Provider<CanvasState> { 60 1 : const CanvasProvider({ 61 : required this.storyRepository, 62 : required this.selectedStoryRepository, 63 : required CanvasState state, 64 : required ValueChanged<CanvasState> onStateChanged, 65 : required Widget child, 66 : Key? key, 67 1 : }) : super( 68 : state: state, 69 : onStateChanged: onStateChanged, 70 : child: child, 71 : key: key, 72 : ); 73 : 74 : final StoryRepository storyRepository; 75 : final SelectedStoryRepository selectedStoryRepository; 76 : 77 1 : static CanvasProvider? of(BuildContext context) { 78 1 : return context.dependOnInheritedWidgetOfExactType<CanvasProvider>(); 79 : } 80 : 81 1 : void updateStory() { 82 2 : if (state.isStorySelected) { 83 3 : final currentStoryPath = state.selectedStory!.path; 84 2 : if (storyRepository.doesItemExist(currentStoryPath)) { 85 2 : final story = storyRepository.getItem(currentStoryPath); 86 1 : selectStory(story); 87 : } else { 88 1 : deselectStory(); 89 : } 90 : } 91 : } 92 : 93 1 : void selectStory(Story? story) { 94 2 : selectedStoryRepository.setItem(story); 95 1 : emit( 96 1 : CanvasState( 97 : selectedStory: story, 98 : ), 99 : ); 100 : } 101 : 102 1 : void deselectStory() { 103 2 : selectedStoryRepository.deleteItem(); 104 1 : emit( 105 1 : CanvasState.unselected(), 106 : ); 107 : } 108 : }