Building an app in Flutter | Thoughts & Learnings

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
<i></i> What's up guys! My name is Andrew and I'm an application developer here at Crema. Today we're going to take a deeper dive into Flutter. Now, you may have seen a video we put out a few months back and it was kind of a high level overview of Flutter versus React and our initial thoughts on the two. I've been in Flutter for now the last eight months or so maybe a little bit longer and still really loving it, but wanted to run through some of my learns and just kind of high level thoughts around some of its capabilities. So let's jump in here. Now the first thing that I've learned and you may have heard it said but it's very very much true is in Flutter, everything is a widget. When they say everything, they mean everything. Now this could include anything from containers to rows to columns stacks. You've got all that base stuff for layouts, but then it gets into some more interesting things you got list tiles you've got list builders and you've got things like slivers which are really, really amazing. It may not seem like much, but let's take a look at it for a second. So list tile, I'm sure if you're familiar with Flutter at all, you absolutely know what this is. You've got a place for leading probably an icon, a little avatar. You have a title and the other subtitle and you have some kind of trailing here. And if you're thinking about how we would build this without a list tile, we'd have a row, we'd have a column, we'd have some kind of container here. We'd have another container here. This would have to be an expanded. There's a lot that goes into this and it's cool because you get this just right out of the box. That's a pretty simple example. But if we look at what's going on here with this interaction on the header, this is where it starts to get pretty interesting with some of the things like slivers which Flutter gives you. So this, we've got a header up here at the top. Inside that header we have an expandable flexible space that's expandable to whatever height you want to give it. You can set a lot of different properties on that. Is it floating? Is it pinned? Is that what's the. The animation is Parallax. And then there's this down here. This little tab bar and as you can see, it sticks to the header and then everything just goes below it really, really nice. It's a super slick animation, super slick interaction in general, and was kind of a nightmare to figure out when I was trying to do it initially. But the cool thing is that that's actually just all a widget. So you've got your sliver set up here on a sliver bar and it goes down into some flexible space bar. And then I have a background and background greeting because I want those to be parallax against each other. And then there's the sliver persistent header. Now that's really doing a lot of the meat of the work with keeping that tab bar stuck to the top there and then use to find the tab bar tabs and you're good to go. So that's some of the things like when if you find yourself getting into Flutter. And one of the big complaints that you hear from people is, "Man, you just have all these nested widgets. Like widgets on widgets on widgets. And it's like getting into prop hell if you were in React or something like that." I found if I ever start getting into that place there's probably a widget made for it already and I probably just need a little bit more research and figure out best practice for it. And that's where a lot of that gets into you helping you out. Now there are some downsides to this that I've found too. I would say 90 percent of all these widgets they're really, really well thought out. They're all to material spec which can be good or bad for your app but some of the things are hard coded tab bars really want to behave as tab bars. Tabs within a tab bar really want to behave as a material tab. And so, trying to build something as seemingly simple as this little pillbox here, instead of just having a typical title with an indicator and maybe even an icon the tab bar does not want to do that. Tabs definitely don't want to do that. And so there's some for dangling that goes into that. Since it's all right here, you can, if you're in VSCode like I am and on Mac, you can command click and that will actually open up the source code so you can jump into it and look through everything right there to understand kind of a little bit more of what's going on. Which can be really super helpful if you are having trouble styling something or just wanting to know actually what's happening behind the scenes there. I found that's been super, super useful. Some other widgets that I've found have been really cool -- There's daytime pickers that average standard. So if I click on this and get this really cool date picker and then I've also got a time picker. This one, like it looks really nice. It functions a little bit strangely at times, and it's really a difficult to style, but it's there for free which I really like. Again material design, so everything is laid out really beautifully. But to style it like some of these things are hardcoded which is not optimal. I'm not exactly sure why that is and so you have to kind of finesse your way through getting into that stuff. But on the whole you get so much out of the box with Flutter and so many base interactions that it is totally worth it. And for me it's sped up my development time so, so much. The other thing that people talk about a lot with Flutter is state management and how to do state management. Well there's a few different options. I start out with the block pattern which is really, really consistent. It's really nice. Then I've moved on now to Provider but you can use Redux. There's a bunch more. There's a bunch more ways to accomplish that and they all have their benefits. I'm sure they all have their cons, too. But we're going to take a look at Provider and just see kind of what that offers you, and what the problems are that it's solving. If you jump into Flutter and just do Flutter Create, you get this very standard little app where it counts the numbers. Hooray. That's very fun. What we're gonna do is build something similar but we're going to just use that base and try Provider. So let's get rid of all this code because we don't need it. Boom you're gone. And what we're going to do is we're going to set up an app that lets you invite your friends to a party maybe. You've got friends? You wanna have a party? So we're gonna set up two screens where it lets you have a list of your friends and you can opt into a party and see the list of people come to your party. So what I've done. Just real, real high level here. We've got a list of friends and friend is just a class with a name and an email. Both are strings. We've got a scaffold with a list and that list is just the friends. And on top we'll get to this. And that's pretty fun. And so what we're going to do, another great thing that Flutter has and I think we touched on in the other video too, is its navigation is native which is huge. I've got the my app stateless widget here in the build method. You've got the serial app. And then within that you can just declare routes. And so I've already set up a invited screen. So it's a separate screen here and I just declare that as one of my roots. This is gonna be how I call it and I'm passing at the context of the rest of the app and then I'm serving up this invited screen. So what that looks like then to actually navigate to, I'm going to have this floating button here. Let's reload the app and I'll show you what that looks like. Got my list of people, and I've got this navigation here to the separate screen. And all I'm having to do is on press I'm calling navigator.of passing the context, doing push name, and then passing that invited. Super simple, didn't have to do hardly any setup whatsoever and it came for free. Now, the next thing we want to set up is state management. Now what we could do, and what is actually happening, what was happening before, is this used to be a staple widget and it was keeping track of the numbers counted just within the widget itself. Now, that's fine, like if you don't need to pass that information back and forth to really any other widgets. But if you need to pass it down to a separate widget or it needs to be more of a global variable that can you'll be passing widgets or passing props all day and will be a terrible, terrible place to be. So we've gotten rid of the staple widget and just have a stateless one now. And what we need to do is set up our Provider. Now, Provider is a package. Provider is the third party but it's really just gonna be syntactic sugar for inherited widgets. It's really not doing a whole lot of magic but it's just giving you some hooks to be able to do things a little bit faster. So what we're gonna do is we're going to in our main (and yes, usually this would be separate) but in Maine, under run out, just do change notifier, provider, and we're going to declare builder, pass the context, and then this little guy here, we've got a folder with providers and this provider is gonna look like this. It's going to extend change notify which is native to Flutter. And it's going to set up the streams that we need to to get a hold of. So we can have a list of invited people here. We'll go down, we create an unmodifiable list. That's how we're going to list out our people that we invited. If we want to know the number of people we've invited we can set up a function for that and then of course we want to add and remove people from the invited list. Now, to do this we're just going to add it to that string but then we're also going to pop this little function and notify listeners and that's going to tell any of the functions that are consuming this list that an update has occurred. Kind of like set state or anything that lets everybody else know what's going on. So we've got that set. we will load that in there. So now this is at the root of our app and everything below that and the tree has access to whatever actually gets put into the invited. This works for this app because we only have one piece of state we're trying to keep track of but there is multi provider which you probably are going to want to use if you have anymore state you're keeping track of. But this is a very simple app so we don't need it. So it looks like this. So down below here and now what I can do is I can grab that provider here with provider dot of I'm passing an invites passing the context and I have this essentially is that whole provider. So my call invites dot add and add whatever this on tap. Essentially, if I click on Mary here that just added her to the list, and I know that because in my separate screen my invited screen I've imported I'm using Consumer and that's another thing that Provider gives you I'm consuming the invites and that gives me the context of the whole route. And then that gives me invites again. And then if I wanted to a child on that for the list I can. But then I can just call invites dot invited that list that we've created from anybody we've added and just list them out the same way we did on our home screen there. And if we look, boom there it is. It's so exciting. Well we have another person on that list. And over here we wanted to see maybe the total number since we can update in both places. We're just going to call invites number of friends invited and then I'll just return the length of that. Just giving us how many people have been invited. So that may seem really trivial in a way but this is a really really simple way to get all of this state passed around with very little code and it's update in both places it's super seamless. I've been using this now for a few months. It's super fast and can handle a lot of data all at once. Which is really nice. The other thing that's really cool, list view builder. I know we don't have that many things in this but I'll just touch on this. It's not to do with state, but it is lazy loading. So you can have hundreds and thousands of records that are passing it through but this will actually be lazy loaded automatically for you. Another huge, huge benefit of that is Provider and that is the way it works. Now how does this differ from the block pattern? It honestly is essentially very almost the same thing. There's a little bit more boiler code that goes into the block pattern, and you have to kind of initiate your Provider a little bit differently. So, if we look at Provider if you're using the block pattern you set up and declare your own Provider here and then you go in later and set it up or you set it up very similarly within your app. I've got all these routes too. But you pass a Provider if that's the context. It's it's a little bit more boilerplate code too within the block itself. But all in all they're very, very similar. The way that things are consumed is a little bit differently to you'd set up a stream builder with the block and consume it that way instead of just having your consumer at invites or whatever you whatever you're doing. But if you wanna invite people to your party this latest so those are kind of the cool things that I've been finding. I mean there's so much to Flutter. Everything's a widget, state management. It's all a little bit differently object oriented program isn't what I was like totally into before. But I really, really enjoy it now. Coming from a React and React Native background you know did the video on "Will Flutter kill React Native?" I don't think. I don't think anything is gonna kill React Native necessarily. It's used so much within the industry. But for me, I do prefer using Flutter. Just speed of development. What you get out of the box, 90 percent of its custom-ability is just really, really good there. But I mean React Native has a strong community around it, too. But really into a lot of things working with Flutter. And as far as support goes, I've seen a lot of the community start to build back up. It is run by Google which that I mean good or bad. Like we can. We'll see. We'll see if it continues. Google likes to kill things so I'm hoping they won't because I'm writing apps in it. So please don't. Please don't google. Yeah, that's about it. There's so much more with Flutter. You've got isolates something I'm going to be working on next is probably Flair and that kind of integration. We just heard this morning that there's something new coming out called Interact in 120 hours. You didn't hear about that you just did. But we'll see what that is. Maybe it's player integration interactions. Maybe it's something else I can say. That's about all I've got for you. Let us know what you guys think. I mean who do you want to see in another Flutter video. Would it be helpful to see more live coding. We love doing stuff like that build an app altogether senatorial. Let us know what you think about Flutter. What are your favorite things? What are your least favorite things? What do you what are the things that you're excited for the future? Put it down in the comments. Make sure to like, subscribe, and we'll see you next time.
Info
Channel: Crema
Views: 338,315
Rating: 4.8610353 out of 5
Keywords: app development, flutter, building an app in jog, flutter vs react native, building an app in flutter, flutter tutorial by google, jog app, flutter review, flutter widgets, flutter app development
Id: XHsrxgoESz8
Channel Id: undefined
Length: 14min 59sec (899 seconds)
Published: Fri Nov 08 2019
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.