Flutter Bloc Library Tutorial (1.0.0 and Up) – Reactive State Management Crash Course

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
state management is needed by every app no matter the size of your project you need to store and do something with all the data present in your app if you are building something small you might be able to pull it off with stateful widgets as the difficulty of the project starts to grow though you have to start looking for more maintainable solutions the flutter block package is a reactive and predictable way to manage your apps State and this package takes everything that's awesome about the block which stands for business logic component pattern and puts it into a simple to use library with amazing tooling and after many months of development the block package has arrived at its first stable version 1.0 point oh hello welcome to resell culture where you are getting prepared for real app development by building better faster more stable app so subscribe and hit the bell if you want to grow your coding skills because complex topics such as state management with block are best understood on somewhat real projects we are going to build a weather search app in this tutorial the app will consist of two pages the first one is the weather search page where we can search for a city for example London and then we can see the details of the city in a weather detail page so this means you're going to learn how to use the same block throughout multiple routes which is definitely a good thing to know and of course we can search for another city York for example and there is also a chance that we are going to get an error in which case it's going to show a snack bar at the bottom all right here we go we finally got an error with the snack bar at the bottom and also this is how the initial weather search page looks like this app will have think that a real lab would have including a repository to manage all of your data from a single point of entry and as you could see we are also going to have visually appealing error handling and because you came here to learn the block library I definitely do not want to bore you with building mundane flattery you eyes and widgets and all of that so you can get the starter project with all of the basic widgets implement it actually the story project will look precisely like this it will have where a model where a repository in all of these pages already implemented and to get this starter project be sure to check out the written tutorial from the link in the description where apart from the starter project you can also find all of the code written in this video links to the libraries and overall go through this lesson at your own pace alright so first to start out we are going to of course import all of the appropriate packages inside the pub spec diamo file we will need to add a dependency to the flutter block package and also to equate Abel they are both from the same author Felix angle off and they work very well together equatable is used for providing simple value equality the flutter block version we are going to use is gonna be version 1.0 0.0 and equatable is currently at version zero point six point one while by now I think these packages are totally stable it still may happen that some future versions will break a certain functionality so if you want to follow along precisely with this tutorial make sure that you have the same versions of these packages in your pop spec yamo since we have added equatable and we already have a weather model class let's go over there and implement that equatable package or actually the class which comes from that package here you can also see what data will be held inside the weather objects we simply have city name temperature Celsius and temperature Fahrenheit temperature Celsius is required whereas Fahrenheit is not required in the constructor and because dart supports only referential equality by default which means that only two instances which are exactly the same they point to the same place in memory only those are equal by default but we want to have value equality meaning that even two distinct instances which have the same data will be regarded as equal and to do that we have to extend equitable which we will import from the equitable package and now we also need to implement the props property which in order to fulfill equitable z' specification needs to output a whole list containing all of the properties which should be included in the value equality comparison so those will be sitting in temperature Celsius and temperature Fahrenheit and with that we've just implemented value equality in the weather model which we are going to pass around the app of course we now have the weather model but how are we going to retrieve the weather are we going to use some kind of an API or what are we going to do well everything important is already implemented inside the weather repository so if you've downloaded a starter project you will have this repository already implemented let's take a closer look at it so that you can understand what we are doing once we start implementing block we have an abstract weather repository class which has two methods fetch weather and fetch detailed weather and both of them take in a city name for which the weather should be fetched of course and then we have one concrete class fake weather repository so we are now going to be reaching out to a remote API we're going to do everything locally we are just going to generate fake temperatures and in the implementation of fetch weather method we simply simulate network delay of one second and then we decide based on random boolean were or not to throw a network error which is only a simple class networker nothing fancy there and then we generate a random Celsius temperature which we then put into a new instance of the weather model class which is then returned from this fetch weather method and we are also caching the temperature Celsius that's because we are inside a fake weather a positive and we need to have this cached temperature Celsius to use it from the fetch detailed weather because as you know already from the demo app if we search for London the search or in other words master page displays only temperature in Celsius but the detail page will display temperature also in Fahrenheit so such detailed weather needs to populate the Fahrenheit field of the weather model and we have this cache temperature Celsius here which we are going to convert to Fahrenheit using this simple formula x 1.8 + 32 cool that's it for the weather repository you don't really need to know about it implementation because it has in fact nothing to do with the block itself you can use any sort of an implementation of the repository but I think you need to understand what's going on inside the repository as we are going to be implementing the block which is going to use the repository and call methods on it also if you want to see a fully fledged app with repository is built with clean architecture and test-driven development be sure to check out the tutorial series from the cart in the corner now that you know what's gonna be happening inside the repository implementation let's talk about the block whether you are implementing the block pattern yourself about which you can check out Oriol from the cart in the corner or you are using the flutter block library as we are doing now the concept is the same you can think of a block as if it was a pipe with one input and one output that's what makes it so powerful and predictable at the same time and the stuff that goes into the pipe the proverbial pipe are events and then inside the pipe block determines what to do depending on the incoming event and then it will output a state it's precisely inside the block based on the incoming events that we are going to decide where to call fetch whether or whether to call fetch detailed weather and so on the way that we can operate with block is that widgets send an event for example when a button is clicked so right now when we go back and we search for a city bla bla bla and hit this search button we are going to trigger an event or in our words to say it more precisely we are going to add an event to the block and then the UI will receive a state which will contain appropriate data for example the temperature and the search for a city name and rebuilt itself accordingly to display what it needs to display to the user so this means that we need at least three classes to make the block happen we need weather event weather state and of course weather block thankfully we do not need to create all of these files and classes manually because block comes with an amazing tooling for developers where you are on vs code or in IntelliJ so if you are on vs code let's go over to the extensions tab and search for block and you want to install this extension the first one which comes from ferris angle off and the link to this extension also to the IntelliJ plugin is also available from the written tutorial also if you want to know which extensions you should definitely have as a flutter developer on vs code check out the tutorial from the cart in the corner with this extension installed you can now just right-click on the lip folder and select the menu option block new block give this block a name we're all in lowercase hit enter and now we're going to select that we do want to use equatable so select yes this will generate a new folder called block which will contain four files where a block where event and whether state and also the bearer file called blog dart which is going to export all of the three other files which will allow for easier imports because we can import just one file and not three of them let's start off with events because before writing any logic for your app you need to know about the use cases which the block will support and since events trigger logic which is executed inside the block you can really think of events as of use cases of the app or of that particular block our app has two use cases for the weather block those are to get the master weather and also to get the detailed weather these two use cases will be represented as events inside the block pattern and just for comparison if you were using something like a change notifier you would represent these two use cases with methods so really events are nothing scary they're just a different way to represent the entry point of data basically we want to have the first event to be a class get wetter which will extend the already generated weather event and since we're event it stands equatable it also needs to override the props property and before we do anything with the props we of course first need to add some property and every event including the get weather will need to have a city name passed in so final string city name and we're going to populate it inside a constructor it can be actually a cons constructor so if the argument is the same city name we're going to reuse the old instance and not just clog up our memory with new instances of basically the same object and now we're going to pass the city name to be inside the props property of equatable which will allow for value equality and now we can just copy this get weather event and rename it to get detailed weather which is going to take also asset name into its constructor but the logic which we are going to execute inside the block will be different for get detailed weather then forges get weather so just to recap these two events will arrive inside the block which is that proverbial pipe that block will determine which logic to run which methods to call on the repository and then holding true to the spirit of the block pattern the data gotten from the repository will be then outputted from the block in a state stream actually I think that it's precisely because of streams and states and all other such things that reactive state management patterns such as block or even Redux on react can be daunting streams require you to change the way you think about the flow of data in your app because we are all used to getting a return value from a method it's very direct you call a method and get the value in the same place however as you could already see previously on the block Graham there are no direct return values in the block pattern instead they're states which have to halt everything needed to rebuild the UI and also the places of adding events and listening to states are separate even inside a regular pipe the water enters on one end and comes out from the other end it doesn't come out from the same ends right the same applies to the proverbial pipe which we call block the simplest way to determine how to create States is to ask in how many different states can the UI appear if you are working with a designer or you've already designed the app yourself asking this question and most importantly finding an answer to it should be fairly simple when I have restarted the demo app which is already finished this is the first state we want to display only the input text field at first so we can call this an initial state then when the user searches for a city so some city and adds an event to the blog by hitting this search button we will at first show the loading indicator so that's another state a loading state and then subsequently we're going to show the actual weather and of course also an error can happen along the way as you could see previously in which case we are going to have a separate error State and of course inside scene details the states will be pretty similar we are going to have a loading State and then also a state for when the weather is finally loaded with the Fahrenheit temperature so therefore it seems that our app will have four distinct states and all of them will be represented by a class we already have initial weather state here we are going to rename it to weather initial and also let's just provide a constant constructor to this class and now let's copy this weather initial class and paste it below name it weather loading and also rename the constructor and now we're going to duplicate this class two more times actually and this one will be called weather a low dead and it's going to actually have one property which will be the weather instance so we're going to need to import weather and populate it inside the constructor and also add it to the props because of equatable because of value equality this weather loaded state needs to hold the weather because after all we need to display the data held inside that weather model object that is the city and also the temperature Celsius and in the case of the detail page we are also going to display temperature Fahrenheit finally we're gonna have weather error state which is going to take in a message and let's also add it to the constructor and to the props so now we have four distinct states where initial where a load in weather load dead and weather error all right so we have the inputs and outputs of the pipe so let's finally implement the stuff that's going on inside that pipe formally this part is known as the business logic and in the case of our weather app we're going to simply fetch data from the weather repository so let's go into the weather blog class and to fetch data from the repository we need to add it as a field of the block and actually we are now going to add the fake weather repository directly but instead on in the abstract class weather repository that's because using an abstract class instead of the implementation of fake where a repository allows us to seamlessly swap between multiple different implementations and it also comes in handy for testing purposes again you can learn all of this how to architect your apps and how to test your apps using the block pattern in the clean architecture tutorial series available on this channel so let's end the final weather repository call a weather repository and populate it inside the constructor and ones also import weather repository over here every block has to override at least two members one is the initial state property which in our case of course outputs weather initial this is what's going to arrive inside the UI layer when the block is first created and of course we want to definitely show the initial thing which is only the input field like this then inside map event to state we're going to do precisely what it prescribes by its name we're going to take events look at their type and determine which logic to run and subsequently output States from this method into the stream of weather state as you can see map event to state is an asynchronous generator signified by this async asterisk keyword and I think it's no surprise that block works with streams under the hood and the way you can output some objects in this case states to the stream in dart is very awesome because we can use the built-in syntax and use the yield keyword to output a state to the stream and when any event comes into this method we definitely at first want to yield the weather loading state so that we are going to show the circular progress indicator now we want to determine which logic we want to run based on the event coming in so if the event is get wetter we want to try because remember that the weather repository is implementation can throw a network error so we're gonna try to get weather from the repository and store it inside final weather is equal to weather repository that fetch weather and we can get the city name from the event so event that city name and now once we have this weather of course we need to await it we are going to yield the weather loaded state and pass in the weather then whenever the network error happens so on network error we are going to yield weather error and let's just say a nice message in here you could of course also provide some integer code which you would then use from the UI layer for translation but we are building only a simple app without any kind of localizations so we're going to just output a string directly couldn't fetch weather is the device online and with that we have the get weather event handled and now let's handle even the get detailed weather event so if event is get detailed weather now because we are only making a tutorial app I hope you will forgive me for creating a bunch of duplicated code because I'm just going to copy whatever the code is inside the gate whether if statement and just change the method called and whether if a story to be fetch detailed weather of course you can separate it out into multiple smaller methods but I think that we are good considering that we are only building a simple project so again whenever an event arrives inside the block we're going to immediately yield we're loading state and then we are gonna determine which event has actually come in and then called appropriate stage where or fetch detail whether on the repository and if everything goes smoothly there are no errors we are going to output we're loaded state which holds the gut and whether otherwise if there is an error we are going to output the weather error state holding a message inside of it now you know how to implement the events States and also the actual block itself all that's left to do is to use the block from the UI and the UI of our weather app consists of two pages search and detail and the starter project already contains all of the basic building blocks and widgets which are needed to make the UI happen so for example inside the weather search page we have a scaffold with a container but currently the only always displays built initial input and of course we want to change this and display even the weather and the loading indicator based on the state's coming out of block so we need to do something about this line but otherwise we have built initial input build loading built column with data which is going to display the temperature in Celsius and also the see details button and all of that good stuff and finally the city input field is a custom widget which just holds a text field and whenever we submit a value inside the text field it's going to arrive inside this method submit city name which of course should add an event to the block so that we can initiate fetching the weather touched city so pressing this button will call this submit city name method which in turn will add an event to the repository and then we are going to react to the state coming out of the block not repository of course and change the method called to build the UI and of course the same stuff applies to the weather detail page first though we need to find a way to get the weather block instance to the weather search page and there are multiple ways to do this for example we could create a final field right over here where a block and instantiate it right over here it goes weather blog and all of that stuff but we are going to follow best practices and start off immediately by providing the block to the weather search page actually you would take a similar approach if you were implementing not block but for example change notifier with provider because even with a regular provider package and change notifier you would still need to provide the changing of the fire down the widget tree so this is nothing really special to block but there are some special things when it comes to how you provide blocks because unlike with change notifier there is a special block provider widget which is built on top of the regular provider widget otherwise everything stays the same but instead of typing provider which actually you can do because block provider is built on top of provider so you can import provider just fine but instead of doing this we are instead going to type in block provider and we can actually use the snippet which can with the vs code extension so block provider and inside the Builder we're going to instantiate the block so in our case that's gonna be the wetter block so let's import block slash weather block over to this file and this needs to take in a weather repository and of course we aren't going to instantiate the abstract class because that's even impossible we're going to instantiate the implementation of the abstract weather a positive class which is the fake where repository so let's import that over here as well let's import also block provider from the flutter block package and the child should be of course the weather search page now we can use the block from within the weather search page and to rebuild the UI based on the states which come in from the block we're going to use a block builder widget so let's remove this to do comment and the child will no longer be the built initial input directly instead we're going to specify a block builder and let's specify the types for the block builder so the block which it should try to get from the block provider is of type where block and the states which are outputted from the block are whether States so now let's import flutter block that's also import in the block Beryl file and now based on the states which come into this builder method we're going to return appropriate widgets and notice that these little built methods which I have already created and which are available in the starter project are basically matching the states because we have weather initial state and we have built initial input we have we're loading state and we also have built loading method so really implementing the different.you is based on States it's very simple if you compartmentalize your methods into these small manageable chunks so give the state is of type weather initial we want to return built initial input else if state is wetter loading we of course won't return built loading otherwise if states is where a load it we want to of course output so return built an out column with data which takes in a context and also weather and where are we going to get this weather from well of course everything is held inside the state and since we are smart casting the state into weather loaded by using this is keyword inside if statement we can immediately just call state which is smart cast it and get the weather from that state and finally are wise so else if state is weather error we want to display a snag bar but also we want to display the initial input so let's first handle that but we also want to display this neg bar don't we well showing a snag bar is actually a side effect which has nothing to do in a builder method which actually should be a pure function as you can see inside the block builder it writes here police refer to block listener so not block builder but listener if you want to do anything in response to state changes such as navigation showing a dialog or even showing a snack bar that's because this builder method should always only return widget and do nothing else as soon as you want to do something else you have to come over to the block or listener the way we can do that is that if we come over to the log builder hit control dot at least invidious code and say that we want to rap with a new widget and the widget name will be block listener which also takes in the weather blog or actually we can just copy the type parameters from the block builder and now inside block listener we have the listener method which also provides us with context and state very much like the Builder method but unlike builder listener returns void whereas builder returns a widget the reason for this separation between the listener and the Builder is actually fairly important the Builder which builds UI can be run multiple times even when the state does not change the listener on the other hand is guaranteed to run only once per state change and you surely do not want to display multiple error snackbars to the user you want to only display a single snackbar and then when flutter decides for some reason to rebuild the UI once again even without the state being changed you just do not want to display this name bar again and again and again so that's why we're going to put this neg bar displaying logic into the listener and not into the Builder so let's just check if state is whether error in which case we are going to get hold of the scaffold so scaffold of context and show a snag bar on that and the snack bar will be simple ly a very simple snack bar which will hold the message inside a text widget and the message of course comes from the state that message because error state the weather error class has a message field and with that we have just implemented both the blog listener and blog a builder for our weather search page however we also need to implement how we're going to trigger the logic inside the block because currently we are only listening and building depending on the state's coming outside of block but as you know something also needs to come in to the block to determine which logic to run and only then we can output a state from the block and to add events to the block we're gonna go over to the submit city name method which as you know by now simply receives the city name present inside the text field right here and we just need to get hot of the weather block which since we are using a provider is very simple so we're going to store it inside the final weather block and just called block provider that off specify the type parameter to be where a block and that's about it as of now we get a link wording that we should close instances of dart core sync but this is a false positive because the stream is actually closed by the weather provider right over in the main and odd Dart the block provider handles everything including the closing of the streams so you are not going to get any memory leaks any such things but the linter just things that we are not closing the instance of the sync but you can safely ignore this and hopefully it's gonna get fixed in the future releases of the dart linter and now to add the event to the block we are going to simply call weather and block that add and the get weather event and pass in the city name alright so now we are officially done with the weather search page but we still have the weather detail page to implement and there are some tricky bits when it comes to navigating between routes with block actually we can now run this app and not already finished demo app so let's do just that and here we go so we can enter a city let's input London and of course we need to not hit enter but hit this search button here we are it works properly we have London the temperature and let's just for the sake of it input another city so ABC maybe and we're going to see it also of course we haven't yet implemented the details screen but let's see what's gonna happen we're going to get just the circular progress indicator that's because inside the weather detail page all we are doing is to output a build loading method in order to not always just build a loading but also to request some actual data by adding the get detailed weather event to the block we somehow need to get the already present instance of the block over to the weather detail page and that's the tricky part I was talking about because when it comes to navigation and block there are some special things you need to take care of if we go over to Maine dot dart here we can see that we are using a block provider to provide the weather block to the weather search page the issue with this is that as soon as we navigate out of the weather search page for example over to the weather detail page that block this one will no longer be access people in that next page to which we navigate that just the way it is there are two ways we can fix this issue the first one is to make this where a block be provided globally we can do that by wrapping the whole material app in the block provider so it would look something like that the material app would be the child of the block provider and then this material app would only hold the actual home which would be the weather search page of course this is not valid code that you get the point we would wrap the whole material app in the block provider and what this will do is that this would make the weather block available globally across all of the routes but because we're block is not really meant to be available globally let's imagine that you are building a complex app with 15 routes and not just with two routes you surely do not want to access the weather block from every single route that would be pretty weird if you had that kind of a need so the second approach to how to provide a where a block to the weather detail page upon navigation is that we're going to use a named block provider constructor right from the weather search page just as we are using the navigator to navigate to the weather detail page basically we want to provide the same already existent value which is provided from the main dart we want to provide this down to the next route to which we navigate so we do not want to create a new instance of where a block we can now just use this regular block provider constructor because this has a builder and the builder should always create new instances of blocks so instead of using this regular constructor of block provider we're going to use block provide that value and we are going to simply wrap the weather detail page in this block provider that value so let's cut it out and let's say blog provider that value and inside of here we need to specify the value which in this case we're going to get it by using again a block provider so what is actually going on here we are using block provider off and specify the weather block we are using that block provider within block provider dial value well if you think about it for a while what's happening here is actually fairly simple we are using the block provider still within the weather search page where the block is perfectly accessible and we are passing that already existent instance of the where a block over to be the value of the block provider that value constructor this way after we also specify the child to be the weather detail page again with this what we've done is that the block will now be accessible even inside that weather detail page and it will be the same block which is provided from Maine down dart it will be the same instance awesome so we have the block available from weather detail page now what in contrast with search page there is no user input on the detail page there is no text input field in which the user can input a city name there is just nothing like that instead the weather detail page is already passed in the master weather which of course contains the city name already so if we do something like master weather that city name and this is available to us so we want to use the city name value of the master weather field and of course to initiate getting the detailed weather we will also need to add an event to the block in this case we are going to add the get detailed weather so when is the best time to add that event to the block obviously it's best to do it as soon as possible so we are inside a stateless widget so what we could do is to use the build method right let's see we can now access the block using the block provider so let's import flutter block over here and we're going to say block provider off again specify the type to be weather block so we need to import everything over here let's actually import the Beryl file so that we have access to the events as well and now that we have the instance of the weather block of course we need to pass in context now what we can do is to just add an event which will be get detailed weather and pass in the master weather dot city name so this is the same city name as is present inside the search page at least for me it doesn't feel right because we are doing something in the build method which should not be there this is a side effect this does not produce any kind of a visual effect any kind of a widget but let's just leave it for now we are going to come to this later let's now finally finish this page by using a blog builder even as here as the child of the container inside a scaffold so block builder let's use the code snippet it will be for whether block and whether state and as you already know inside the block builder we should go over all of the states which can be outputted from the block so in this case inside weather detail page the state be so state is we're loading and in such a case we are going to simply return billed loading so that's gonna be the circular progress indicator which you could already see as we were demoing the app and then the only other state so else--if is the weather loaded because over here we are now gonna have weather initial States nor the weather error because it's just how we've set up the things if we take a look at weather repository we can see that the network error is only output is from fetch weather and not from fetch detailed weather so inside fetch detail whether we are safe from any errors of course you would not be safe from errors if you were using an actual HTTP package and not just simulating Network requests locally but of course you have to modify your code to your needs so back inside where a detail page whenever there is a weather loaded state arriving inside the block builder we want to return built column with data and pass in the state that weather over to that method with that we can now again run the app but remember that we are still having the block provider off call inside the build method directly which is generally not a good thing to do so let's see why that is here we go we first need to search for a city maybe ABC is a good name oh we've got an error here so let's search for something else hopefully now it's an old man now it throws errors of course everywhere is an error because we are basically having a 50-50 chance to have an error now we do not have an error so that's cool and now when we go over to see the details we are going to see them in fact but look what happened when we heart restart the app maybe if I move this window a bit to the right and now no you're not going to see it but anyway when I now hot restart the app by simply hitting ctrl + s to save it and as you know flattery is awesome because it supports hot rebeaud so I do simple hard reload and immediately you can see that it triggers reloading inside the UI as you can see when I drag it quickly you can see that the UI is changing to be built loading and then in the game goes to build column with that this is happening precisely because this block provider called to add get detailed weather event is happening every time that the UI is rebuilt but we do not want to have that we do not want to initiate getting the detailed weather every single time that the UI is rebuilt so we cannot just leave this call inside the build method no we have to move it somewhere else and that is not in - in its state because from in its state you cannot access a block provider but instead of in it state we are going to move this logic into did change dependencies of course for that neither for in its state nor for the change dependencies we cannot be inside a state less widget so let's convert this widget to be a state full widget and with that we can now just cut out this block provider call to add event and inside the date change dependencies method so did you change the appendices we are going to perform the same call and what this is going to do is that it's still gonna immediately add event to the block when this wear detail page is created by navigating to it but it's not going to call it multiple times when the UI is rebuild oh but we have built errors so let's remove this slash for some reason it's there now that it's not there let's restart the app with all of these changes of the stateful widget instead of stateless widget and let's see how it works so if we input a city and search for it hopefully we're now going to get an error and we don't so that's cool and now when we see the details we're gonna be presented with the detail page so the Fahrenheit is definitely here and now what's important is that when I hot re load the app you will not see anything it's just not going to happen actually what I could do is to put a breakpoint over here and breakpoint also into the build method right and now when I had reload you see that the breakpoint inside the build method gets executed but the breakpoint inside the change dependencies does not that's precisely the reason why you should always put some initial data fetching for the block over to the date change dependencies method and not to the build method in fact build should really not contain anything else than the building of widgets everything else should go to in its state or if you need to access a block provider or some other kind of a provider through inherited widget you would put that logic into big change dependencies but never to the build method directly to go through this tutorial at your own pace once again and to get all of the code check out the written tutorial available from the link in the description and Rousseau coder comm now you know how to use the powerful flutter block library in your own projects and unlike other state management patterns block forces you to do things just one way and the right way with its one-way dataflow using events and states block is a sure way to bring more structure extensibility and most importantly maintainability to your apps if you do not want to miss more tutorials like this regarding flutter block and flutter architecture and building awesome flutter apps definitely subscribe to this channel and also join the notification squad by hitting the bell button to make sure you grow your flutter skills because here on resale coder I am determined to provide you with the best app development tutorials and resources out there if this video helps you with understanding the block pattern also with using the flutter block library give this video a like and also share it with our developers who will surely benefit from it too leave a comment if you have anything to say any suggestions or questions if you want to get exclusive flutter news delivered every single week right into your mail inbox go to resew code or calm and subscribe to my mailing list if you want to grow your flutter skills and see you in the next [Music]
Info
Channel: Reso Coder
Views: 62,353
Rating: undefined out of 5
Keywords: resocoder, tutorial, programming, code, programming tutorial, flutter tutorial, bloc pattern, state management, flutter state management, flutter bloc, flutter bloc pattern, flutter bloc pattern explained, flutter bloc library, flutter bloc library tutorial, flutter provider vs bloc, flutter bloc rxdart, flutter crash course, flutter crash course 2019
Id: hTExlt1nJZI
Channel Id: undefined
Length: 54min 27sec (3267 seconds)
Published: Sat Oct 26 2019
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.