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