Flutter for Absolute Beginners: What I Wish I Knew | Ali Feizollah | Skillshare

Playback Speed

  • 0.5x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 2x

Flutter for Absolute Beginners: What I Wish I Knew

teacher avatar Ali Feizollah, Computer Scientist, PhD

Watch this class and thousands more

Get unlimited access to every class
Taught by industry leaders & working professionals
Topics include illustration, design, photography, and more

Watch this class and thousands more

Get unlimited access to every class
Taught by industry leaders & working professionals
Topics include illustration, design, photography, and more

Lessons in This Class

11 Lessons (50m)
    • 1. Introduction

    • 2. Flutter: What and Why

    • 3. IDEs for Flutter App Development

    • 4. Installing Flutter

    • 5. A Flutter Project Structure

    • 6. Flutter Widgets

    • 7. Flutter Basic Widgets

    • 8. Dart - Enum

    • 9. Dart - Dynamic vs Var

    • 10. Dart - Const vs Final

    • 11. Learning Resources

  • --
  • Beginner level
  • Intermediate level
  • Advanced level
  • All levels
  • Beg/Int level
  • Int/Adv level

Community Generated

The level is determined by a majority opinion of students who have reviewed this class. The teacher's recommendation is shown until at least 5 student responses are collected.





About This Class

Why Did I Create This Course?

I decided to start learning Flutter long time ago. I had programming experience, but I didn't know anything about Flutter. Based on my programming knowledge, I jumped into it.

Then, I realized it's different than programming languages I knew. Not in terms of coding, but in terms of project procedures, order of files and folders, and structure of a project.

It took me some time to learn the concept of Flutter. Looking back at my experience, I decided to make it easy for others when they want to learn Flutter from scratch.

What Does This Course Cover?

This course starts by presenting what Flutter is and why we should use Flutter.

Then, it talks about IDEs and how to choose one for app development. It shows you how to install Flutter and set up your IDE to work with Flutter.

It then dives into the structure of a Flutter application. This is a lesson you don't want to miss. It shows you different folders and files inside a project and their role in building an app.

It also shows you where to add fonts and images that you need to use in the app. Similarly, you will learn how to add various plugins to your app to add extra functionality.

This course doesn't teach you coding, but at the end of the course, we provide some useful resources to start learning to code in Flutter.

Everything Is A Widget

You may have heard it that everything in Flutter is a widget, even the app itself.

We talk about widgets and how they work. Also we discuss basic widgets. You will see some examples of widgets.

Designing an app is also discussed in terms of layout of the app. When a developers wants to design an app, they need to think of the design in terms of widget arrangement like rows and columns. We show a practice on how to design a test app.

Who Is This Course for?

  • Someone who wants to start learning Flutter.
  • Someone with no programming background.
  • You may learn something new even if you have programming background.
  • This course doesn't teach you coding, but teaches you how Flutter works.

What Do You Get from This Course?

  • How Flutter works.
  • You will be ready to start coding, or learn coding.
  • You will learn how to arrange widgets for your app design.
  • You will learn learning resources to start coding Flutter.

Meet Your Teacher

Teacher Profile Image

Ali Feizollah

Computer Scientist, PhD


Hello, I'm Ali. I have a PhD in computer science. I am currently working as a postdoc. I conduct research on social media analysis. I established my web site to help students with their research. I also have a YouTube channel that shares tutorial on Google's Flutter platform that is used to develop mobile applications for Android and iOS with one base code. I love research and exploring knowledge. I think acquiring knowledge without sharing it is useless. I hope you find my classes helpful.

See full profile

Class Ratings

Expectations Met?
  • Exceeded!
  • Yes
  • Somewhat
  • Not really
Reviews Archive

In October 2018, we updated our review system to improve the way we collect feedback. Below are the reviews written before that update.

Why Join Skillshare?

Take award-winning Skillshare Original Classes

Each class has short lessons, hands-on projects

Your membership supports Skillshare teachers

Learn From Anywhere

Take classes on the go with the Skillshare app. Stream or download to watch on the plane, the subway, or wherever you learn best.


1. Introduction: Hi and welcome to this course. Thank you for choosing this course. This course is flutter for absolute beginners. What I wish I knew. I will introduce this course in this video. First, why discourse was created? Long time ago I decided to learn flutter and I had some programming experience, but I didn't know anything about flatter. So based on my experience and knowledge of programming, I jumped into creating a project in flutter. Then I realized that it's a bit different from other programming languages in terms of project procedures and project structure, and order of files and folders. So it took me some time to learn the concept of flutter. Now looking back at my experience, I decided to make it easy for others when they want to start learning flutter. What does this course cover? It covers basics of LOTR for someone who wants to start it and wants to develop an application. It first starts by defining what flatter, ease and why we should use it. And then it talks about IDE's and what IDs are available, and how you should choose your IDE based on some conditions. And then we jump into installing flutter for your operating system and then setting up the flutter and also the id. Then we start interacting with a flutter project and describing what this structure ease for flutter project. That includes how to add fonts, where to install plug-ins. And if you want to add some icons where you should define your icon and where you should put the icon inside the flutter project. And then we go into widgets. You may have heard it that everything is widget in flutter, even the app itself. So we talk about widgets, what they are, how they work, and we discuss basic widgets. And we will see some examples of widgets. Also designing the app is an important step in an app development. So we discuss the app design in terms of layout of the app. How you should structure the interface of the app, and how you should arrange the widgets. This app design is based on the arrangement of widgets like rows and columns. And we show one example of an app interface and how we can design the app in terms of widget arrangement and not coding. Who is this course for? This course is for someone who wants to start learning flutter. Someone with no programming background, who wants to get knowledge of what flutter is and how it works, even if you are a programmer and have programming background, there are some still news things that you may learn in this course. But one thing to remember that this course does not teach you coding, but it teaches you how flutter works and how the project is structured. After going through this course, what do you get out of this course? One is how flutter works and you will be ready to start coding if you have programming background or you will be ready to learn coding in flutter, you will also learn how to arrange widgets for your app design. And at the end of the course, you will learn the resources that are useful for learning how to code flutter and start your app development. So I hope this is a right course for you. I'm very excited to start this course. And thanks again for choosing this course. I will see you in sight. 2. Flutter: What and Why: Let's talk about what the flutter ease and why you should use it. What is flutter? Google introduced flutter in 2017. Flutter is a UI toolkit for building beautiful applications. There are compiled natively for mobile, web and desktop systems. Flutter is built based on dark language and Dart is a simple object oriented programming language. And the first version of flutter 1 was released in 2018. So about the question of why we need to use flutter, we need to remember that the final goal in flutter is to write a single code base and develop it for multiple systems. In this way, we reduce the development costs and speed up the development process for different operating systems. This feature is still not final. For example, for web and desktop applications, it is in a new stage, but Google is aiming to enable developers to develop programs for different systems. And at this moment, flutter can be used to develop cross-platform applications. For example, for Android and iOS, it is fully developed and for Web, Windows, Linux, and Mac, they are gradually introducing new features. So what are the advantages of using flutter? One is the cost effectiveness of flutter. As we discussed with flutter, app development comes to a cost-effective level where we have a single code base for developing application for multiple operating systems. It eliminates the need to have separate Developers team, although it is not possible to have a single code base for all the operating systems completely. We still need to code some part of the program for specific operating system. But that codebase, that basic code is very helpful in terms of developing applications for multiple operating system. The second advantage of flutter is single codebase. As we said, fluttered takes away the need for developers to write different codes for iOS and Android. And we mean the basic codes, although for some applications, some part of the code needs to be modified for specific operating systems, but the basic is a single codebase. The next one is easy maintenance with flutter, deployment of new features and maintenance of mobile applications is now much easier and more convenient as a single code base is required to deploy the applications. And another advantage is Advanced UI and UX. With flutter, we can create intuitive user interface to provide the best experience. Also, developers are not bound by the implementation restrictions imposed on native UI frameworks. So these were summary of what the flutter ease and why we need to use flutter and also some of the advantages of using flutter. In the next video, we are going through the environment of coding and we will discuss where to code our flutter and where to develop our application. So I will see you in the next video. 3. IDEs for Flutter App Development: In this lesson, we see where we can develop a flutter application. To develop a program, we need to have an environment to write the code and execute the code. What is IDE? Ide stands for Integrated Development Environment. It's an environment to write, execute, and test our code. There are basically two famous IDEs for flutter. One is Android Studio developed by google and other one is visual code studio developed by Microsoft. We also need Xcode if you are working on Mac and developing the iOS part of the flutter to do some modification if necessary to your flutter up. So how do you choose which IDE to work with? It all depends on your personal preference and reads to you is specific to mobile development, but Visual Studio Code is capable of editing and opening projects in many languages. For example, if you want to work with Java or Python codes, you can use Visual Studio Code for those languages as well as flutter, This was a short video on what IDE's and two types of IDEs available for flutter. In the next video, we are going to see how we can install these IDEs on your windows or your Mac. So I will see you in the next video. 4. Installing Flutter: In this lesson, we are going to install flutter on Windows. And also we are going to install and configure Android Studio and Visual Studio Code. First, we go to flutter that div website and we click on get started and we select windows in the requirements. We see that we need to have Git for Windows as a requirement for flutter, good is necessary for flutter to work. So we go to the website and we download the gates and install it on the machine. Then we are going to download flutter for Windows, which is the flutter SDK. After the download is finished, we are going to extract this folder. Remember that when you extract this folder, You need to put it somewhere permanent and you cannot move it after you configure the SDK. In my case, I downloaded and unzipped the folder into Program Files. I have the flutter folder and inside it I have been folder which is needed for later configuration. Now we go to Start Menu and we type ENV, and we select edit, the system environment variables. In this window, we go to environment variables and we find paths. We double-click on path, and we create a new entry. In this entry, we provide the path to this flutter beam folder. I have added this one here in the program files. Flutter. When, once we added this path, we click ok. And in the start menu we type CMD and we run the command prompt. And type flutter. You should see the list of commands available in the flutter SDK. This means that the flutter is installed and the path is set in your Windows. Now we run flutter, doctor, this runs some diagnostics on your computer and and specifies if there is any components missing in your flutter installation. When you set up the flutter for the first time. You also need to accept some licenses. You type flutter Dr. dash, dash, android dash licenses. And then it shows you some licenses that you need to accept. After you accept licenses for a couple of times, you'll finish the installation for the SDK. After this step, you need to go to Android Studio and download the Android Studio, this setup and this website flutter that div, has all the necessary steps that you need to take to download and install the flutter SDK. And you download Android Studio and install it on your Windows. After you install Android Studio, you'll run the Android Studio by going to the Start menu and type Android Studio. After you run Android Studio, you need to go to File Settings. You search for plugins. Inside the plugins. You go to market place and you search for flutter, and you install the flutter plugging for your Android Studio. Also, you need to search for Dart and you install this plugin for Android Studio, and then you restart Android Studio and you have the Android Studio Setup and register you is one of the IDEs that is used for flutter development. Another one is Visual Studio Code. You search for Visual Studio code and you download the Windows version and install it. After you install the Android Studio code, you run. After you install Visual Studio Code, you go to the start menu and run Visual Studio code. And in this page, you go to Extensions and you search for flutter. You download the flutter extension and you restart your Visual Studio code. After this, you can develop applications inside that Visual Studio code and you can run them in Android Studio and also Visual Studio Code. If you faced any error or difficulty. Along the way, you can always go back to the flutter dot diff and go through the steps and see if you miss any steps on the way. And also you can search for any error that you face. Just type the error in the Google search. And there are lots of Helps available on the web. I hope this was helpful. If you face any difficulties, you can contact me and I will try to answer you as soon as possible. Thank you for watching this lesson. I will see you in the next one. 5. A Flutter Project Structure: Welcome to this lesson. We're going to talk about flutter file structure when you open a flutter project and it is your first time you are developing a flutter application. It could be confusing. You don't know what the structure of a flutter project is and where you should start developing, and where you should add your files, and where you should install some plugins and so on. So in this lesson we are going through the flutter projects and see what are the components of latter projects. So first is the lib folder. This folder has the main code for the flutter application. So when the philosopher runs and when the application is launched, the OS, whether Android or iOS, locks for this file inside the lib folder, the main file is the file that operating systems look for when an application is launched. The iOS or Android operating systems look for this file, main file, and then goes to respective screens based on the instructions that are available in the main fund. So let's see the lib folder inside a flatter project, you have this lib folder. Inside lib folder, there is a main dot dot. This is the file that is executed first. The next one is pod spec dot yaml. This file contains all the necessary plugins and packages for the flutter app. You can install a new plugin by listing it here. It also enclose any photos or pictures like logo or funds that you include in your application. So if I open pub spec dot yaml, which is available here, you can see that we have under dependencies, we have in this case and in this project, we have many plugins. For example, we have Cupertino icons, which is a default plugins available for any new projects. And then we have other plug-ins in this project are available also inside the Pub spec dot HTML file. We have the font section, which includes all the customize fonts that you need to use in your application and also assets. Assets is the folder that we are going to discuss later that includes all the photos and images of your application. You declare the folder here. So the application knows where to find the fonts and where to find the images. You just need to set these plugins once and you install them in your application once. By clicking on pub gets, and the application is going to run the plugins and use it inside your application. The next one is Android and iOS folders. These folders contain codes for specific operating system. You may need to change or add some code specific to Android or iOS. If we check the projects. In this project we have Android folder and we have iOS folder. If you need to change any specific file, for example, in the Android, you may want to change permissions, for example, or intent. You need to go to this android folder and specifically change that setting for this operating system. In a similar way, you can go to the iOS folder and change the settings specific to iOS. And you have additional form folders that you may use in your application. For example, it is a common practice to add assets folder, as we mentioned before, that includes any logo or pictures. It is also common to have a font folder. And if your application is complex and have many custom made widgets, you can create folders for specific code and specific components. For example, one folder for each screen on your application, or one folder for all your custom made widgets. For example, in this project, we have a folder called assets. Inside assets, we have the front pictures and logos to use in this project. Also, we have fonts folder. Inside the fonts folder, we have different types of fonts that we need to use in our applications. And as mentioned before, after creating these folders, you need to mention them in the pub spec dot yaml file, in the font section and in the asset section. And additionally, you may have folders inside your lib folder. Lib folder is a folder that you write your code for your applications. And main.out Dart is a first starting point of your application. So when you create a new project, the only file you have is main.out dot here. In this case, we have one file for each page of the application. For example, in the main file, there is instruction that the home page is my homepage. So for the, my homepage, which is the next screen on our application, we have created a separate file inside them, my homepage, there is a link to sign in page. For that we create another file for that screen. And after that, the application goes to another screen. So we have another file for the other screen. In this way, you can easily divide your applications into different components and different pages. So if there is something wrong or there is any error, you can easily go to a specific page and troubleshoot. Also inside the lib folder, we have the folder called components. The name of the folder you can set any name you want is not specific to type of the file you want to create. For example, in this case you, we call it components, or you can call it widgets, or you can call it any name you want. Inside the components, we have constants, we have my drawers, which is the menu for our lab, our application that slides from left side of the application. Inside this, we can specify what we need to include. For example, we include feedback, we include aerate, this application. We include about us. This is separate component of our application and we can make it separate inside a folder so it is easier to refer to and we want to change thumb. Something of all is if there is an error. We also have rounded button and sign in button because each button is highly customizable and each elements in your flutter application is highly customizable. Instead of adding all these code inside the main file, we define them here in a specific file, file. And then we refer to this file in the main code. It is much easier and it is more manageable if you want to edit something or if there is an error you want to troubleshoot. So this is the structure of a flutter application and flutter projects. So next time you want to start a project, you know where to start. And if you want to add an image or if you want to add a font, you know how to add them. Or if you want to install a plugging, you know how to install a plugin and where to go to install a plugin. I hope this was helpful. I will see you in the next lesson. 6. Flutter Widgets: In this lesson, we are going to talk about flutter widgets. First, we need to know what widgets are. Widgets are just pieces of your user interface. Text is a widget, for example, and buttons are widgets. Textboxes are widgets, images or widgets. Everything you see on the screen, and everything you don't see on the screen are widgets. And even the app itself is a widget. So widgets can be visible or invisible. Visible widgets are texts, buttons and images, and invisible widgets are rows, columns, padding, and margin. We can represent the wages in a tree shape diagram. How do we put all widgets together and how to structure them? That is the layout of the application. It is called the layout. The core of flutters layout mechanism is widgets. It is structured as a widget tree, as you can see here, this is a widget tree. The first screenshot here at the left and top shows three icons with labels for each one. And the second screenshot, this place, the visual layout showing a row of three columns, where each column contains an icon and a label. So this second image shows visible widgets, icon and the label, the text and invisible regions, the row and column. First, we have a row and inside the row with divided into three columns. And inside each column we have an icon and a label. And if we represent this as a tree diagram, this is the diagram for widget tree for this user interface. As you can see, we have container at the top, and then we have a row, which is this row. And then we have three columns. They are children of this row. We call them children of the widget at the top level and inside each column, as we can see, we have an icon and we have text. So inside each column we have two children. One is ICANN and the other one is container, which has the text as a children. Why not put text as a child of column? And we use container instead. A container is a widget that allows you to customize its child widget. We use a container when we want to add padding, margins, borders, or, or change the background color. In this example, we put each text inside container widgets, and we add margins. Also the entire row, as we can see at the top, is placed in a container. To add padding around the row. We can control the rest of the layout by properties. For example, why not put this icon inside the container? Because ICANN has the properties that we can use to change the color of the icon. For example, if we want to change and set the icons colour, we use the Color property. One of the things that is a bit confusing is padding and margin. Padding is the space inside the widgets and the margin is the space between two widgets. For example, in this interface, you can see that we have on the right side beautiful space. So we can set the margin and padding of the row inside our code. This is another example. For example, if we have a heading, a text, the space inside our box is called padding, and the space outside the box and between widgets is called margin. So this is the border of our text. And then we can add padding or we can add margin for outside space. This is another good example of widgets and how they are structured inside an application. For example, this is the main login page. And then inside the widget tree, we move to the second page of the app. And then inside the second page, we have other widgets, my app bar, and some items as a list item. So when you click on the list item and you select the cart icon, it goes to the third page of the app. So this is good example to understand how the widgets work inside an application. And you can see that the whole app is a widget at the top. And then each screen is separate widgets. And then each page, each screen has its own set of widgets. So that is helpful for understanding the widget and widget tree in flutter. I hope this was helpful. I will see you in the next lesson. 7. Flutter Basic Widgets: In this lesson, we are going through some of the basic widgets in flutter, how to create a layout? When you want to create a layout, you have three options. One is to use material app design, or you can use non-material app design, or you can use a mix of both. What is material app design? The material app design has many predefined widgets. And the widgets were created by Google standards. And widgets follows certain material design guidelines. To use material app design, you can build a material app using scaffold widget provides a default Banner background color, and you can add drawers, snack bars, and bottom sheets. Then you can add the center widgets directly to the body property for the homepage. When you create the material app, you automatically have the title and home screen. And then you create your scaffold. And then you can set your app bar and the title. And inside the body you can have center and then you can have text. For example, after this red line, you can follow the design for your app. And before this, you can have your app bar. You can set your title and you can, you can set your homepage. These are all predefined, but when you go for a non-material app design, you have to add the Center, for example, centre widgets directly to your built method. And basically it means that by default, in nonmaterial app doesn't have bohr title or background color or drawers. You have to create them by yourself. So it's much easier to follow the material app designed for your application when you want to arrange your widgets, you have two useful widgets, rows and columns. Columns are used to manage your widgets vertically. And Rose R4, horizontal management of your widgets. And for each column or row, you have to provide lists of children to that row or column. For example, here we have a column and inside the column we have three children. If you define a role, you have to provide a list of four, in this case for children. And when you add an image to your application, it's possible that the image is larger than the space provided. So you get these yellow and black stripe pattern, which indicates the overflow of image inside your application. And to fix this issue, you can use expanded widget. In the expanded widget. You provide your image and then the image is resized to the space provided. In this case, we can see that we have a row and then we defined children inside the children of the row. We have two images and for each one we have the expanded widget. And then we provide the image as the child of the expanded. This way the image is resized automatically for the space inside your app. In the standard widget, we have container, which gives you customize ability of your widgets. You define a container and you provide a child to that container. And you can add padding, margin. You can change borders, background color, or other declaration to that widget. We also have GridView, shows the widgets inside the grid view as scrollable grid. And we have ListView if you want to add a list of items inside the list. So it takes care of how they are represented in a list. You can also have stack widget, which is used for overlapping a widget on top of another widget. For example, if you want to design a shape, you can stack one shape on top of another shape and you have the final log for your application. And in the Material widgets we have card which organizes related information into a box with the rounded corners and it drop shadow. For example, inside a car, you can have a title, you can have image, you can have a text that describes that image. And that is going to be one widget which is card, and other one is list tile. It orients, rises up to three lines of text and optional leading and trailing icons into a role. So if you want to have a role, and then inside the row u, you have icon and then text. You can use a list type. It automatically arranges the icon and the text for you. And as mentioned before, you can use containers to add padding, margins, border, and you can customize your widgets using the container widget. You can also change background color or image. And the container takes one single child we did. But this child can be row or column, which are themselves have children and they become part of the container. So as a practice, when you see this application and you want to design the application like this. First, you need to break it down into the widget tree that we saw in the previous lesson, what we just do need to have, how to arrange them. For example, in this case, you can have one B column, which is the whole app. You can have one child, two represent the output. You can have another child, the column to represent the operation. You can have another child that represents the number pad. For this, you can use the grid view that we previously mentioned. And you can have a row. Inside the row. You can have 1234 columns. And again, you can have a row with two columns, each representing the comment. Remember that each one, each row, for example, this row, this row, these are children of the column of the whole app. So you have the column of the whole app. Then you have rho inside the column, and then you have four columns inside the row. And then you can customize the spaces between these icons. So when you want to create a design, you have to think about how to arrange the design in terms of rows, columns, and widgets. And then you can come up with the first prototype and then you can customize the spaces and a little details. So that's all for this video. I will see you in the next lesson. 8. Dart - Enum: Let's talk about enumeration is used for defining named constant values. And enumerated type is declared using the enum keyword. And each of the symbols for elements in the enumeration least has integer value. Just like array or list. The value starts at 0. Here we have an example, a non weekdays, and inside that we have Monday, Tuesday until Sunday. And if we want to print that, we say weekdays dot values. Let's see why we need to use a no and enumeration. For example, if we have different states of weather, for example, we have sunny, cloudy and rainy. And based on code, and depending on our code, we need to compare the results to each of the states and see which one matches the weather. Let's use constant instead of enumeration. We can say constant Sonny, sonny. And then constant. Cloudy equals cloudy. And constant rainy equals to rainy. Now, when we have these constant and in our code based on our analysis and the result, we have the result which is choice equals to sunny. We analyze the weather and we decided that today is sunny. And now we want to compare today's weather with one of the states that we defined earlier as constant. We use switch. In switch, we provide our variable. And then inside sewage, we use case, case, sunny, print sunny today, and then break. And then we need to compare the value of choice, two other constants as well. We run the code and we get, it's sunny today. Now instead of constant, Let's use enum. And this is the code for NO, we define whether sunny, cloudy, rainy, outside the main. And then inside we have whether that's sunny. And we use switch to specify which case is true and equal to whether that Sonny, we have case sunny, cloudy with NO, you will get a warning. That case rainy is missing. So when you use enum and switch, you need to include all the cases inside your NO. And that's the difference between having constant variables and enter. And it's easier to define NO, to manage your constants inside one collection. I hope this was helpful. Thanks for watching. I will see you in the next video. 9. Dart - Dynamic vs Var: In this video, we are going to see the difference between war and dynamic. In general, when you don't know the datatype of your variable, you can assign the datatype of var or dynamic to your variable. And the dark figures out the datatype of your variable. Now let's consider this code. I defined. My variable and data type is dynamic, and I initialized the variable to this string. This is a variable. So the data type of my variable is now string. Now, or you want to assign one to three, which is integer to y-variable and replace the value which is string now. And when I assign the 123 to my variable, the datatype needs to be changed. And the datatype is going from string to integer. And then I print my variable. If we run this code, we can see the result is 12 3. Now let's change the datatype to war and run the code. We can see that we get an error saying that a value of type int can't be assigned to a variable of type string. So the difference is that when you define your variable with var, once you assign a datatype to your variable or assigned any value to your variable, you cannot change the datatype of your variable after the initialization. But in dynamic, the datatype is dynamic and you can change the datatype in your program whenever you need it. So that's the difference between dynamic and warm. I will see you in the next video. 10. Dart - Const vs Final: What is the difference between constant and final? Constant is a variable that is initialized at compile time and is already assigned when at runtime. Compile time is when your code is translated into machine code, which means 01. And runtime is when your code is actually running line by line. So when it is at compile time, the program must know the value of variables. And if it is something that is not known, you will get an error if you use const keyword. And you can define const inside a class, but you can in a function. And cons can be changed during runtime. And this is the example. One plus two can be assigned to a constant variable, but datetime dot now cannot be assigned to a constant variable because the value is not known when the code is compiled, but when the code is running and at run time, the value of datetime dot now is known. And final should be used over cons if you don't know the value at compile time and it will be calculated at runtime. For example, if you want HTTP response that can't be changed, you can use final. If you want to get something from a database or if you want to read from a local file, you use final. And anything that isn't known at compile time should be final. Not constant. Here inside the Dark Pad. Lets define a constant variable and assign 1, 2, 3 to this variable. And then we print the variable. We run this code and we can see the value 123 is printed. Now let's change constant to final. This one is also correct, but let's go back to constant and let's assign datetime dots now. And when we run this code, we get an error cannot invoke a non-constant where constant expression is expected. And if we change these two final, we can see the result. So the difference is the value of the variable. If you know the exact value, you can use constant. And if you don't know the value, you have to use final. That's it for this video, I will see you in the next one. 11. Learning Resources: Now that you know basics of flutter and how it works, you can start learning from different sources. And one of the good point to start is flutter cheat sheet. Cheat sheet gives you lots of information in one single page or two pages. So you don't need to look around for specific syntax in your code. Or a way to create a widget or use a widget, you can just look at the cheat sheet and you can get your answer. You can search for flutter cheatsheet. There are many available sources. For example, this one has a PDF that provides quick reference to syntax in Dart language, which is the language that flutter is built on. So if you have any question about the syntax of the while loop, you can come here and take a quick look and know how the syntaxes, or you can take a look at the functions and how the functions are written. So you can have a quick idea of how to write function. And other one is flutter layout cheat sheet. This is a Medium article that is very comprehensive on the various widgets in the flutter. It has rows and columns, stag, expanded, align container, various operations inside the container that you can do for customizing your widget, material sized box, safe area. And for each one, it has image that shows you how it looks and the code for achieving that particular customization for the widget. A very long article and you can go through this one and you can get an idea of how each widget works and how to code for each widget. And another one is fluttered cheat sheet in GitHub. This one starts from installation for Windows and for Mac, and it goes to layouts. It shows you how card widget works and how to code card widget and also buttons. It discusses buttons and the effects, floating action button, action bar, and lots of different widgets. And last but not least, the Google resource for flutter is very comprehensive. You can go to basic widgets. For example, container. There is a video for container and you can take a look at the behavior of the container. And you can see the example of container and constructors and the properties that each container has. For example, container takes a child, which is the widget for customizing the widget. And then lots of operations also listed here. So it's very comprehensive in terms of variety and different types of widgets. You can also go to YouTube and search for flutter channels. This is the official channel for flutter. If you go to playlist, you find widget of two week day introduced lots of widgets in widget of the week. So far, they have 90 videos. In each video, they go through specific widget. They define what it is and how you can customize it and gives you an idea of different widgets that are available for you if you want to use them. I also have a YouTube channel that I teach for latter in details, I have videos about signing authentication in flutter, Google's signing authentication, adding data to database authentication using username and password. And if you want to publish your application, you need to sign your application. And I have explained how to get your key value to sign your application. I also have different videos for flutter applications. For example, based databases for flutter application or a guide on mobile security aspect of flutter applications. These are some of the resources that you can go to to learn flutter. There are lots of tutorials and courses available on flutter. But YouTube is the one that is dynamic. And it's continuing to give you up to date information about different parts of flutter and widgets. I hope this was helpful and I hope to see you soon.