CategoriesProgramming

Cloudbuild with Android – Using Encrypted Environment Variables

Hi there! At my current work, we had a problem with our CI/CD, and we started to look for alternatives. We checked out various platforms like CircleCI, Bitrise, and others. Still, the process to ask the upper-level management to add this as providers was a bit slow and tedious so, since we already had GCP as a provider, we decided to try GCP Cloudbuild.

Cloudbuild is an infrastructure that allows you to run builds for your projects. The price was reasonable, so we decided to start investing time on it to move our Android CI/CD all to cloudbuild.

As first we started looking for some previous experience on the internet and found two excellent articles about it, those articles will be linked below. Nevertheless, those articles required a certain knowledge of Docker, CloudBuild, and other technologies that I didn’t have.

So I started learning about it to understand these articles better. What I wanted to achieve first was to read an encrypted environment variable. With this goal in mind, I started my quest.

Note: Articles in which this post is based.

https://ryanharter.com/blog/cloud-build/

https://medium.com/dailymotion/run-your-android-ci-in-google-cloud-build-2487c8b70ccf

First, let’s enable GCP KMS

What we need to do first is go to the GCP console, create our new project, and enable the KMS. You must go to Security → Cryptographic Keys.

Note: KMS stands for Key Management Service.

Sidebar menu which shows the cloud build KMS

Creating a Keyring and a Criptokey

A Keyring can hold various CryptoKeys. To create a Keyring, you need to use the following command:

“yourkeyringname” is the name of your Keyring, and you should replace it for your what suits best for you, and the flag –location=global means that this Keyring is available in all regions of your project.

Now that we already created a Keyring, let’s create our new CryptoKey, for that we’re going to use the next command.

“KEYNAME” is the name of the key you want to create, and the–keyring flag is to indicate to which Keyring it’s going to belong since we’re using as an example “yourkeyringname” it will belong to it.

Encrypting the variable

To encrypt our variable, we must store it in a plain text file and then create a ciphertext file from that one. For that, we’re going to use the next command.

What this does for you is to encrypt your my_variable.txt file and convert it to my_variable_encrypted.txt using your Keyring and your cryptokey. After that, you need to create a base64 from your encrypted variable, and that can be achieved using the next command:

If you’re using macOS you can use:

In Linux, the command is:

The result of this process is going to be something like this:

Note: This is an example. Your base64 is not going to be the same.

Now let’s store this base64 until we finish the next step.

Creating our AndroidBuilder

In this step, we’re going to create our new Docker Image and pass to it our secret as a Build Argument. If you never created a Dockerfile before, probably you want to learn about it before continuing with this topic.

What we do in this Dockerfile is:

  • Obtain the javac builder from GCR (Google Container Registry).
  • Update the system.
  • Download the dependencies.
  • Set our “build arg” with the name SECRET.
  • Set the ANDROID_HOME as an environment variable.
  • Copy our gradle-build script(This is a little script that helps us to store the gradle cache so the subsequent builds can be faster).
  • Download the android sdk tools, set our tools as an environment variable, and finally install the Android SDK.

This is the gradle-build script that is mentioned in the Dockerfile.

Note: This Dockerfile and gradle-build script are based on this article that helped me a lot. I only added a few instructions, the latest android platform, build-tools, platform-tools, and the ARG SECRET line.

If you’re a more advanced user of Docker and GCP, you can use the community cloud builder, which can be found here. I wanted a simpler proof of concept, so the previous one was the one that fit best for me.

As the last part of this step, we’re going to create a cloudbuild.yaml, which is going to build our container and upload it to the Google Container Registry. In this cloudbuild.yaml file, we’re going to execute a command which builds the container. There is where we’re going to run our Android project. In this cloudbuild.yaml, we pass our secret and use the base64 that we generated before, here’s how it’s going to look.

In this file, we’re building a Docker container and passing our secret as build arg. You can see that we’re using a double dollar sign to escape the cloudbuild substitutions, which are, for example, the $PROJECT_ID, then we’re declaring that we’re going to use the secret at the end of our cloudbuild.yaml. Remember to replace “yourprojectname,” “yourkeyring,” “yourcryptokey” and your base64 in the previous file.

Finally, we use the following command to build it and send it to the Container Registry.

Important: If you’re getting an error because the Container Registry doesn’t have permission to decrypt you must go to your GCP console, Select Cloudbuild, go to configuration and copy your service account email, go to Security → Cryptographic keys → Select your key → Click the add member button in the right panel, add it as a member and select the role of decrypt cryptographic keys.

The cloudbuild file in our android project

Now that we created our container to run our Android project, what we’re going to do is to create the cloudbuild file of our Android Project.

First, we’re going to create a couple of GCP Storage Bucket, and the Storage Buckets are object storages provided by the Google Cloud Platform. In other words, it helps us to store things. In our case, it will be helpful for our Gradle cache and apks.

To create it, we’re going to open up the terminal and type the next command.

In our cloudbuild.yaml we’re going to describe the following steps:

  • Copy our cache into our GCP Storage Bucket using the gsutil image from Google Container Registry. The GCP provides this image, so we don’t have to build our own.
  • Run a KtLintCheck task on our previously created AndroidBuilder.
  • Run a detekt task in our AndroidBuilder.
  • Run our unit test always on our AndroidBuilder.
  • Assemble our Apk.
  • Store the cache.
  • Store our apks in a storage bucket.
  • Finally, we set the timeout for the build to 1200 seconds.

Note: Ktlint is a linting tool for Kotlin, and you can read more about it in this awesome article by Nate Ebel. On the other hand, detekt is a static code analysis tool for Kotlin, and you can read more about it here.

Set up the triggers.

Now we want to set-up the build triggers, so each time we push a branch, we can run our build to verify that everything is fine. To do this, we need to go to console.google.com, select our project, go to the navigation menu, select cloud build, triggers, connect our repository if you haven’t already, and then click the create trigger option. It looks like this.

Create Trigger in GCP form

This is a trigger that we want to run when a new feature branch is pushed to the repo. To test it, you need to push a new branch to the repo and check the GCP console history. If everything went well, you’re going to see something like this.

Successfully worked trigger

You can also try your builds locally using cloud-build-local.

Test your build locally

Pushing to GitHub to trigger the build can be annoying and a slow process. If you want to test your build, you can test it in your computer using cloudbuild local and running the following command:

Note: You need to install first cloud-build-local with the following commands.

You can read more about it here.

Where do we go from here

This was a proof of concept that I used to learn new things and to propose it to the DevOps team, in my job, I wanted to help them to help our Android team as I mentioned before this can be hugely improved so feel free to improve it or to use the community cloudbuilder if that fits your needs.

Ryan Harter has a series in which he talks about how to increment the build numbers and how to store the build cache. If you want to go even further, play around with the community builders.

What you can take away from this

If you’re looking for an alternative to circleCI, bitrise, or others, and you’re not afraid of a terminal and learning new things (Assuming you’re like me and didn’t know anything about cloudbuild) cloudbuild is cool. Surely it doesn’t have the beautiful UI/UX of one Continuous Integration provider. But it does very well the job. So it depends on your needs.

That’s it

If you have any questions, suggestions, or improvements, please leave a comment 😄. You can also reach me via Twitter @gvetri18.

CategoriesDart

How Classes works in Dart

Hi! We’ve been learning about Dart for some weeks, if you’ve been following this series, you know we learned a lot of topics. In this post we’re going to talk about Classes in Dart, the Classes are one of the basics of programming.

📘 What is a Class

A class is the object blueprint. Inside the class, we can find their properties, constructors, and functions. We already talked about functions in Dart, so we’re going to skip that part.

Properties

The class properties are variables declared inside the class. For example, if we have a class named Car, the car color can be a string variable with the value “Blue.”

Constructors

The constructors help us to initialize and set the values of our object. When we create a class and pass some variable as a parameter, we’re using a constructor.

🤔 How to create a Class in Dart

To create a Class in Dart, we need to use the reserved keyword class and then the name of the Class. For example:

class Dog {

}

With this, we can create any Dog we want. But there’s more our Dog needs a name, so let’s create a variable that assigns that name.

class Dog {
  String name = "Rocky";
}

That’s great! Now every time we create a new Dog, it’s going to have Rocky as the name. Now we need to add our dog’s ability to bark. For that, we need to create a function.

class Dog {
  String name = "Rocky";

  void bark(){
    print("Woof Woof! 🐶");
  }
}

We already have a blueprint for a Dog named Rocky who can bark. All we need to do is create an object from this blueprint is use the constructor.

var MyDoggo = Dog();

The previous example shows us how we can create a Dog object using a default constructor. But what if we want to create another dog with another name? Not all dogs are named Rocky.

🐶 Creating uniques dogs with constructors

To assign the name of our Dogs, we need to create a Constructor inside the class, which can help us to initialize our Dog objects with their name.

class Dog {
  String name = "Rocky";

  Dog(this.name)

  void bark(){
    print("Woof Woof! 🐶");
  }
}

Now we can create our Dogs using the following code.

var doggo = Dog("Sparky");
doggo.bark();

There are more Constructors. We’re going to talk about those in the next CodingSlices Extended. Remember to follow me, so you don’t miss it.

🐕 Finally, here is a spooky dog.

That’s it

I hope you liked it. Do you want to learn more? I’m also creating new CodingSlices about Flutter on Instagram, feel free to follow me in @codingpizza for more content.

I’m also writing an eBook, which is a basic course of Dart. It’s about all you need to know to get started with Flutter. It’s free, and you can sign-up here.

Now is your turn

You can try these concepts in IDE like Intellij idea community, which is free. All you need is to install the Dart plugin. Visual Studio Code or in some online editors like Dartpad.

Previous post

If you’re interested in more posts like this, you can check out my others post about Dart.

Variables

Functions

Parameters

Control flow

Collections

Powerful list functions in dart that you should know

 

CategoriesDart

Powerful list functions in Dart that you should know

Powerful list functions in Dart that you should know

In the previous post about Dart, we talked about Collections in Dart. We spoke about List, Maps, and sets. And today, we’re going to talk about some functions that are awesome and can help you in many cases.

Note: In this post we use in various cases the anonymous function, if you are not familiarized with it, you can check my other post about functions.

Map

The map function exists in many programming languages, and Dart is not an exception. This function creates a new list after transform every element of the previous list. This function takes as a parameter an anonymous function. Let’s see an example.

var list = List.of({1,2,3,4});
var mappedList = list.map( (number) => number *2);
print(mappedList);

In this example, we create an anonymous function that has a number as a parameter, and we multiply that number per two. The result of this function is:
(2,4,6,8)

Sort

Sometimes you receive a list from the server, and you need to show it to the user. But what if you need to apply some filter and sort it in an ascending way? Well, this function can help you. Let’s see an example.

var randomNumbers = List.of({14, 51, 23, 45, 6, 3, 22, 1});
randomNumbers.sort();
print(randomNumbers);

This is the result.

[1, 3, 6, 14, 22, 23, 45, 51]

Generate

This function is great when you need to create a list of numbers for a test. It takes as first parameter a number, which indicates the size of the list and an anonymous function which tells the generate() function how to create the numbers inside the list.

Here’s an example.

var generatedList = List.generate(10, (number) => number * Random().nextInt(50));
  print(generatedList);

In the example we can see how we can generate a list of ten elements and multiply it by a random number from 0 to 50.

Take

The take function literally takes the first elements from the list. This can be useful when you have a list of winners and want to take the top 3. Here’s how you can use it.

var list = List.from([1,2,3,4,5,6]);
var topThreeList = list.take(3);
print(topThreeList);

The result of this example is: 1,2,3

Skip

The skip function is the opposite of the take function. This function ignores the first elements and creates a list of the remaining ones. This example shows how you can use it.

var list = List.from([1,2,3,4,5,6]);
var skipList = list.skip(3);
print(skipList);

The result is: 4,5,6

Where

This function is one of my favorites. It helps us to create a list of elements that satisfy a predicate. That means that your element list is going to have only elements that meet your requirements. Let’s say that you need to create a list of only even numbers.

var randomNumbers = List.of({14, 51, 23, 45, 6, 3, 22, 1});
var evenNumbers = randomNumbers.where((number => number.isEven));
print(evenNumbers);

The result of this example is 14,6,22.

An awesome tip

These function can be combined to achieve a greater solution. You can combine a where function with a sort function to get the even numbers sorted in ascending way.

var randomNumbers = List.of({14, 51, 23, 45, 6, 3, 22, 1});
var evenNumbers = randomNumbers.where((number) => number.isEven);
evenNumbers = evenNumbers.toList()..sort();
print(evenNumbers);

In this example we take only the even numbers from the randomNumbersList, then we convert these numbers to a List finally we use the cascade operator.. to sort() the list in an ascending way.

The final result is: [6, 14, 22]

That’s it

I hope you liked it. Do you want to learn more? I’m also creating new CodingSlices about Flutter on Instagram, feel free to follow me in @codingpizza for more content.

I’m also writing an eBook, which is a basic course of Dart. It’s about all you need to know to get started with Flutter. It’s free, and you can sign-up here.

Now is your turn

You can try these concepts in IDE like Intellij idea community, which is free. All you need is to install the Dart plugin. Visual Studio Code or in some online editors like Dartpad.

Previous post

If you’re interested in more posts like this, youcan check out my others post about Dart.

Variables

Functions

Parameters

Control flow

Collections

 

 

CategoriesDart

Collections in Dart

Hello everyone, this week we’re going to talk about Collections. Collections are a crucial part of every project. As always let’s start with what are Collections.

Collections are objects that groups multiple elements inside of them; a List is one of them.

Let’s say we have a list of lottery numbers. We can create a list from it.

The lotteryNumbers is a List,which is part of Collections. In Dart, we can create a List in different ways.

Using var

You can create a null list using the reserved keyword var and the name of the list.

Null VS Initialized

There’s a difference between a null list and an Initialized list. I recently found an image that explains it well.

An empty list is when the list exist but there is not element on it. Null instead means you don’t have a list initialized yet offcourse there’s a more scientific way to explain this, but this is a good example to start.

You can create list as follows.

If you’re curious, you can try to print the size of each list using the .length property and compare the results.

Creating a list for a specific type

If we need to create a list from one specific object type, we need to specify it inside angle brackets in the following way.

In this example we’re creating a list of only String objects.

In case we need to create a list with multiple object types, we need to use the dynamic keyword instead of String.

You can also create a list using the List.of function, we already used this way in the first code snippet.

Retrieving elements from the list

In case you need to retrieve an element. What you need to do is to use brackets beside the List name. This gives you the element from that list in that position. Also you can use the elementAt() function.

Here’s an example:

The result of this example is going to be the first number of that list, in our case the number 1.

Adding an element from the list

This time we’re going to add an element to an already created list. All we need to do is to use the .add function and pass as parameter the number we want to add.

Add items are pretty straightforward

Deleting an element from the list

This time we’re going to do the opposite, we’re going to remove an element from the list. What we need to do is to have the position of the element and use the .removeAt() function.

Which number do you think we removed from this list? If your answer is number 1. You were close, but that’s incorrect, we removed the number 2 because the list position starts from 0.

Value  -> [1,2,3,4,5]
Position->[0,1,2,3,4]

Another type of Collections

Introducing Maps, Maps are unordered key-value pair collection which helps us to associate a key to a value. You can create a map specifying the key type and the value type as follows:

After this reference from the nineties, we can see that each Power Ranger has a dinosaur associated with.

Obtaining an item from a map

Sometimes we need to recall only one of our Zords, how we can do it in a map? All you need to do is indicate the key inside brackets just after the name of the map.

This example returns the Zord of the red ranger.

How to remove a ranger from the map

If you need to remove an element from the map what you need to do is to use the .remove() function and pass as parameter the key. Here’s an example.

How to add a new ranger to our map

When we have a new member in our crew, we need to create a map and then assign it to that map the key and the value only after that we can add that ranger to our map. Here’s an example.

As you can see in this previous example, we created a map with a string key and a string value. Then we assign the key inside the brackets and assign the value “Sabertooth Tiger” to that key.

Last but not least

We can’t talk about Collections without mentioning Sets. A set is an unordered collection of unique objects. Two things worth mentioning about sets are: First, you cannot get an item by index and second, adding a duplicate
item has no effect.

Here’s an example about how to create a set

Remove from the set

If we need to remove an element from the set we can use the function .remove().

Adding an item to the set

When we need to add an item to the set we use the .add() function.

As I mentioned before we can’t add a duplicate object to the Set.

That’s it

If you’re new into programming, I hope this helps you, and if you’re not, I hope you liked it. I’m also creating new CodingSlices about Flutter on Instagram, feel free to follow me in @codingpizza for more content.

I’m also writing an eBook which is a basic course of Dart It’s about all you need to get started with Flutter. It’s free and you can sign-up
here.

Now is your turn

You can try these concepts in IDE like Intellij idea community which is free. All you need is to install the Dart Plugin. Visual Studio Code or in some online editors like Dartpad.

Previous post

If you’re interested in more posts like this, you can check out my others post about Dart.

Variables

Functions

Parameters

Control flow

 

CategoriesDart

Control flow in Dart

Control Flow

Hi there!, in the last month I’ve been writing about Dart and how things work in this language. If you’re new here, you can check my other post about Dart. I’ll leave it down below.

Variables

Functions

Parameters

Power without control is useless.

In this post, we’re going to talk about how Control Flow, works in Dart. Let’s start with what it is, Control Flow. In simple words is the order in which your code is executed.

Let’s say we need to choose between going outside with an umbrella or not. We check our Weather app, and if it says it’s going to rain we take it with us, otherwise we can leave it at home.

If we want to write that in code, this can be.

if (isGoingToRainToday()) {
 takeUmbrella() 
} else {
 print ("What a great weather today 🌞")
}

If statements

The if statements help our code to make a decision, it has the following syntax.

if (condition) {
 doThis()
} else {
 doAnotherThing()
}

We start with the reserved keyword if, then we add a condition inside the parentheses. If that condition is met the code inside the first curly braces is going to be executed. Otherwise, the code after the else statement is executed. The condition at the end is a Boolean value; let’s see an example.

In the previous example, we wanted to check the weather to know if we needed to take the umbrella with us. But what isGoingToRainToday() is? Well is a function which returns a boolean. It looks like this.

Boolean isGoingToRainToday() {
	return false
} 

Here’s a tip the else statement is not always needed. If you only need to execute what it is inside the if statement you can omit it.

If you need to make a comparison with more than two options you can also use an else if statement, let’s see how it is.

var flavor = "Vanilla";
if (flavor == "Vanilla"){
	print("Here's your vanilla ice cream");
} else if( flavor == "Chocolate") {
	print("Here's your chocolate ice cream");
} else {
	print("Since we don't know your favorite flavor, here's a random one");
}

In this example we have a favorite flavor of ice cream, the if statement is going to check if the flavor is vanilla if it is not, is going to try the else if condition. If any of the condition mentioned before are met, the else statement is going to be executed.

What happen if we have too many flavors?

Introducing the Switch case

The switch statements work with variables instead of a condition if the switch has a “case” for the value of the variable the code inside that case is going to be executed. If the switch can’t found a case for it, the code inside the default case is executed.
Here’s an example.

var flavor = "Vanilla"
switch (flavor) {
	case "Vanilla":
		print("Here's your vanilla ice cream");
	case "Chocolate":
		print("Here's your chocolate ice cream");
	case "Orange":
		print("Here's your orange ice cream");
	default:
		print("Since we don't know your favorite flavor, here's a random one");
}

The for statement

The for statement is a common statement that exists in almost every language. Is used to iterate an array of objects. The syntax in Dart is as follows:

for (var i = 0; i < list.length; i++){
 print(list[i]);
}

This statement may look confusing but let’s split this declaration, the variable i start at value 0, and it will increase by one until it reaches the length minus one of the list.

For each time the variable increase by one, the code inside the braces is executed. This print that “i object” from the list.

The for statement is useful when you know when it’s going to end. In our case, we now it because list.length is limited.

While statement

The While statement on the other side works better when you don’t know when a condition is going to meet. It will execute the code inside the braces until the condition is met, for example.

int laps = 0;
while (laps < 5){
	print("Laps $laps");
	laps++;
}

In this example, the code inside the while is executed until the laps are less than five.

Laps 0
Laps 1
Laps 2
Laps 3
Laps 4

The sibling of the while is the do while

Introducing the sibling of the While statement, the Do while statement. This statement executes the code and after the statement evaluates it. Here’s an example.

int countDown = 5;
do {
 print("Time remaining: $countDown");
 countDown--;
} while (countDown != 0);

This code is going to print the countDown variable while it’s different than zero. Here’s the result.

Time remaining: 5
Time remaining: 4
Time remaining: 3
Time remaining: 2
Time remaining: 1

That’s it

If you’re new into programming, I hope this helps you, and if you’re not, I hope you liked it. I’m also creating new CodingSlices about Flutter on Instagram, feel free to follow me in @codingpizza for more content.

Do you know I’m also writing an eBook which is a basic course of Dart. All you need to get started with Flutter. It’s free and you can sign-up here.

Now is your turn

You can try these concepts in IDE like Intellij idea community which is free, all you need is to install the Dart Plugin. Visual Studio Code or in some online editors like Dartpad.

Previous post

If you’re interested in more post like this you can check out my others post about Dart.

Variables

Functions

Parameters

CategoriesDart

Parameters in Dart ¿What types exist?

Parameters

Hi there! In the last post, we’ve been talking about variables and functions. If case you missed it, you can check our previous post here.

Variables

Functions

We saw them previously.

On the previous post about functions, we talked about parameters. We saw an example in which we need them as ingredients to do a IceCreamMachine works. We can also say that parameters are dependencies that a function requires to execute their code.

Required parameters

The required parameters are the most basic parameters that a function can use, you specify a type, a name, and you’re ready to go.

We already saw them in the previous post on the sum function example:

The integer a and the integer b, are used inside the function and then are returned.

Optional parameters

These parameters are optional because you can omit them when you use that function. To make a parameter optional, we need to put them inside brackets and at the end of the signature, if you’re using required params. Let’s see an example.

In this function, we can see how the optional parameter is placed before the required parameters if you put the optional parameter first the compiler would complain.

Ok, but what happened with the variable $secondName if it is not passed? The variable is going to be null. We don’t want to print “John null Wick.” for that, we can add a default value that we’re using later in case the optional parameter is null.

To add a default value to an optional parameter, all we need to do is an assignment. You can see it better in the following example:

Now the value is going to be an empty string, and the name will print correctly.

Let’s talk about how we can use the previous function. We actually can use it as follows:

You can make all your parameters optional by wrapping your parameters with brackets, in this way:

Named Parameters

This type of parameters allows you to indicate in the function signature which parameter are you passing into it. For that, we need to surround our parameter with curly braces.

Here’s an example:

In this example, we’re using the name and the surname as required parameters. And the second name as a named parameter and in case nothing is passed to it the value will be an empty string.

When we want to use the last function with the optional parameters, we use it in the following way:

As you can see the named parameter should be included inside the parentheses.

In case we need to have a function with only named parameters, all we need to do is surround all the parameter section in the function signature with curly braces.

With the last function, we can specify the parameters but also change the order in which we use it because the order of the parameters doesn’t matter.

For example:

Isn’t it amazing? The named parameters improve the function readability a lot.

Now is your turn

You can try these concepts in IDE like Intellij idea community which is free, all you need is to install the Dart plugin. Visual Studio Code or in some online editors like Dartpad.

Previous post

If you’re interested in more post like this, you can check out my other articles about Dart.

Variables

Functions

Learn more

If you liked this post, I’m writing more like these in a free ebook which is a basic course of Dart that can help you to later start with Flutter, that awesome framework for develop multiplatform apps. If you’re interested, you can get it for free following this link.

CategoriesDart

Functions in Dart

In this section, we’re going to talk about functions, how it works on Dart and the function types.

🤔What is a function?

A function is a block of code that should be organized, perform a single task, and should be related to the class we’re working on.

Functions should also be reusable. This would reduce the quantity and increase the quality of your code. If it is done correctly.

👨‍🔬Function anatomy

There are many function types in Dart. First, we’re going to learn about how a function works then we’ll going to explain the other function types.

The functions are usually created with the following syntax:

Where:

void is the return type of the function. This means that when the function executes all the code inside, it should return this value.

Wait a minute. We’re not returning anything, and we’re just printing a name. And that’s because when we don’t need to return a value, we use the reserved keyword void.

printName is the name of the function, a name we’re going to need to use it later, the name should explain what this function is.

(String name), inside this parentheses, we’re going to specify the type of the parameter and the name of that parameter. Parameters are variables that are available inside the function, and we’re going to talk more about parameters in the next chapter.

Let’s see a classic example:

This function helps us to sum two integers, we provide the first value and the second value, and it returns the sum of both. We can use it as follows:

In this code, we created a variable called result which stores the result we get from the function sum,

when we print it the result is 4.

In a nutshell, we can say a function works like an ice cream machine, you add the ingredients (parameters), and it should return you a delicious ice cream. Let’s see another example:

In this more advanced example, we created a function called IceCreamMachine which returns an AwesomeIceCream object. And object is an instance of a class. We’re going to discuss it later. But keep in mind that AwesomeIceCream is an object like Strings, Integer or Double.

➡️Arrow function

The arrow function is a function that can have only one line of code, you may notice that it has no braces instead has an arrow.

This type of function helps us to keep our functions small and improve the code readability. Let’s convert our other examples to an arrow function.

Let’s start with the sum function. In the first place, we need to remove the braces and add the arrow; after the arrow sign, we add the logic of our function. That’s it! You successfully created your first arrow function.

Now why don’t you try to convert the ice cream machine function?.

🕵️‍♀️ Anonymous function

As we say before the functions should have a name, but in the case of the Anonymous function, it doesn’t, this function are called in-site a passed as parameters to other functions 🤯.

Note: What the forEachFunction does is to execute the code inside of it for each element in the list. We’re going to see more about these functions and collection in another chapter.

This is going to have the following output:

We have the chocolate flavour
We have the vanilla flavour
We have the orange flavour

What happened here?. The forEach() function receive as parameter a Function, in Dart Function is a type like any other.

For the anonymous functions the syntax is the following:

If you’re still confused you can see it as a shorthand for the following example:
Let’s say that you have a list that you want to iterate to print items, but you don’t want to do the print items in the same method that you’re right now. Something like this.

Because we want to have that logic in another method, we can create a function called getPrintElementFunction().

This function returns a function 🤯. This function is quite rare. You can use the function inside your forEach method as follows:

This code could compile and is going to print the same result as the function we saw before, but it’s quite ugly if you’re going to do something simple inside of it.

Now is your turn

You can try these concepts in IDE like Intellij idea community which is free, all you need is to install the Dart Plugin. Visual Studio Code or in some online editors like Dartpad.

Previous post

If you’re interested in more post like this you can check out my others articles about Dart.

Variables

Learn more

If you liked this post I’m actually writing more like these in a free ebook which is basically a basic course of Dart that can help you to later start with Flutter, that awesome framework for develop multiplatform apps. If you’re interested you can get it for free following this link.

CategoriesDart

Variables in Dart

What are variables?

In this post we’re going to learn about variables in Dart, variables are like tiny-boxes that keeps references to a value, and this tiny-box can have a name so we can identify and remember it pretty easily.

How do we create them in Dart?

In Dart, we can create variables in three ways:

Using the reserved keyword var

We can create a variable using the reserved keyword var before the name of the variable and the value. Here’s an example:

This is called Type inference. What it does is that the compiler can automatically deduce the type of the variable or an expression.

Declaring the type of the variable

We can also declare the type of the variable as follows:

Using the reserved keyword dynamic

The dynamic keyword allows us to declare a variable that the type can change at execution tyme and can be defined in this way:

Now is your turn

You can try these concepts in IDE like Intellij idea community  which is free, all you need is to install the Dart Plugin. Or in some online editors like Dartpad.

Learn more

If you liked this post I’m actually writing more like these in a free ebook which is basically a basic course of Dart that can help you to later start with Flutter, that awesome framework for develop multiplatform apps. If you’re interested you can get it for free following this link.

 

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies