<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Besong-Anong Ernest Egbenchong II on Medium]]></title>
        <description><![CDATA[Stories by Besong-Anong Ernest Egbenchong II on Medium]]></description>
        <link>https://medium.com/@besonganongernest?source=rss-e694d0fbbd8a------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*67OBoTFSsWYbQ_zAsILDZw.jpeg</url>
            <title>Stories by Besong-Anong Ernest Egbenchong II on Medium</title>
            <link>https://medium.com/@besonganongernest?source=rss-e694d0fbbd8a------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 23 May 2026 12:24:42 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@besonganongernest/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Managing States in Jetpack Compose: A Beginner’s Guide.]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@besonganongernest/managing-states-in-jetpack-compose-a-beginners-guide-ea010e170aab?source=rss-e694d0fbbd8a------2"><img src="https://cdn-images-1.medium.com/max/2600/0*S9Fp-Wez9-IruSWf" width="2880"></a></p><p class="medium-feed-snippet">Every Android developer needs to create apps that respond to events. When appropriately done, your app displays new information reflecting&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/@besonganongernest/managing-states-in-jetpack-compose-a-beginners-guide-ea010e170aab?source=rss-e694d0fbbd8a------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@besonganongernest/managing-states-in-jetpack-compose-a-beginners-guide-ea010e170aab?source=rss-e694d0fbbd8a------2</link>
            <guid isPermaLink="false">https://medium.com/p/ea010e170aab</guid>
            <category><![CDATA[jetpack-compose]]></category>
            <category><![CDATA[android-development]]></category>
            <category><![CDATA[managing-state]]></category>
            <dc:creator><![CDATA[Besong-Anong Ernest Egbenchong II]]></dc:creator>
            <pubDate>Sun, 23 Mar 2025 15:58:59 GMT</pubDate>
            <atom:updated>2025-03-23T15:58:59.874Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[21 Android Studio Keyboard ⌨️ shortcuts to Boost Your Productivity.]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://blog.kotlin-academy.com/21-android-studio-keyboard-%EF%B8%8F-shortcuts-to-boost-your-productivity-82740697cf5f?source=rss-e694d0fbbd8a------2"><img src="https://cdn-images-1.medium.com/max/2446/0*G5_GNBaJ_D7udFzm" width="2446"></a></p><p class="medium-feed-snippet">A lot can be done with your keyboard and mouse as primary tools for navigating and performing certain actions on Android Studio. But what&#x2026;</p><p class="medium-feed-link"><a href="https://blog.kotlin-academy.com/21-android-studio-keyboard-%EF%B8%8F-shortcuts-to-boost-your-productivity-82740697cf5f?source=rss-e694d0fbbd8a------2">Continue reading on kt.academy »</a></p></div>]]></description>
            <link>https://blog.kotlin-academy.com/21-android-studio-keyboard-%EF%B8%8F-shortcuts-to-boost-your-productivity-82740697cf5f?source=rss-e694d0fbbd8a------2</link>
            <guid isPermaLink="false">https://medium.com/p/82740697cf5f</guid>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[keyboard-shortcuts]]></category>
            <category><![CDATA[android-studio]]></category>
            <category><![CDATA[shortcut-plugins]]></category>
            <dc:creator><![CDATA[Besong-Anong Ernest Egbenchong II]]></dc:creator>
            <pubDate>Wed, 11 Sep 2024 07:31:56 GMT</pubDate>
            <atom:updated>2024-09-16T05:31:11.853Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How to Implement a Splash Screen in Jetpack Compose with the SplashScreen API.]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://blog.kotlin-academy.com/how-to-implement-a-splash-screen-in-jetpack-compose-with-the-splashscreen-api-6f2767ede9d9?source=rss-e694d0fbbd8a------2"><img src="https://cdn-images-1.medium.com/max/2600/0*JSn9qX3-d0ZiQX3W" width="4000"></a></p><p class="medium-feed-snippet">Introduction</p><p class="medium-feed-link"><a href="https://blog.kotlin-academy.com/how-to-implement-a-splash-screen-in-jetpack-compose-with-the-splashscreen-api-6f2767ede9d9?source=rss-e694d0fbbd8a------2">Continue reading on kt.academy »</a></p></div>]]></description>
            <link>https://blog.kotlin-academy.com/how-to-implement-a-splash-screen-in-jetpack-compose-with-the-splashscreen-api-6f2767ede9d9?source=rss-e694d0fbbd8a------2</link>
            <guid isPermaLink="false">https://medium.com/p/6f2767ede9d9</guid>
            <category><![CDATA[android]]></category>
            <category><![CDATA[jetpack-compose]]></category>
            <category><![CDATA[splash-screen]]></category>
            <category><![CDATA[splashscreen-api]]></category>
            <dc:creator><![CDATA[Besong-Anong Ernest Egbenchong II]]></dc:creator>
            <pubDate>Tue, 06 Aug 2024 05:42:24 GMT</pubDate>
            <atom:updated>2024-12-03T10:04:05.047Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How to Integrate Google Fonts into Material3 Jetpack Compose Android Apps.]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/how-to-integrate-google-fonts-into-material3-jetpack-compose-android-apps-fd381d65054b?source=rss-e694d0fbbd8a------2"><img src="https://cdn-images-1.medium.com/max/1200/1*ICyxpKv-kcjhysJWeJrtiw.png" width="1200"></a></p><p class="medium-feed-snippet">An easy-to-follow guide for using Google fonts to style text.</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/how-to-integrate-google-fonts-into-material3-jetpack-compose-android-apps-fd381d65054b?source=rss-e694d0fbbd8a------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/how-to-integrate-google-fonts-into-material3-jetpack-compose-android-apps-fd381d65054b?source=rss-e694d0fbbd8a------2</link>
            <guid isPermaLink="false">https://medium.com/p/fd381d65054b</guid>
            <category><![CDATA[android]]></category>
            <category><![CDATA[google-fonts]]></category>
            <category><![CDATA[jetpack-compose]]></category>
            <dc:creator><![CDATA[Besong-Anong Ernest Egbenchong II]]></dc:creator>
            <pubDate>Wed, 12 Jun 2024 13:31:49 GMT</pubDate>
            <atom:updated>2024-06-12T13:31:49.830Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Building Static and Dynamic list in Jetpack Compose.]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://blog.kotlin-academy.com/building-static-and-dynamic-list-in-jetpack-compose-5ff17b83821b?source=rss-e694d0fbbd8a------2"><img src="https://cdn-images-1.medium.com/max/2600/0*0jwTA8A2m5TvcyV_" width="8984"></a></p><p class="medium-feed-snippet">Scroll modifier vs LazyList.</p><p class="medium-feed-link"><a href="https://blog.kotlin-academy.com/building-static-and-dynamic-list-in-jetpack-compose-5ff17b83821b?source=rss-e694d0fbbd8a------2">Continue reading on kt.academy »</a></p></div>]]></description>
            <link>https://blog.kotlin-academy.com/building-static-and-dynamic-list-in-jetpack-compose-5ff17b83821b?source=rss-e694d0fbbd8a------2</link>
            <guid isPermaLink="false">https://medium.com/p/5ff17b83821b</guid>
            <category><![CDATA[jetpack-compose]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[android-development]]></category>
            <dc:creator><![CDATA[Besong-Anong Ernest Egbenchong II]]></dc:creator>
            <pubDate>Mon, 20 May 2024 07:31:43 GMT</pubDate>
            <atom:updated>2024-05-20T07:31:43.870Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[What do the “is” and “as” Keywords in Kotlin mean?]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://blog.kotlin-academy.com/what-do-the-is-and-as-keywords-in-kotlin-mean-1d496f4483cc?source=rss-e694d0fbbd8a------2"><img src="https://cdn-images-1.medium.com/max/2600/0*GSZlpC6m42piP7pr" width="3397"></a></p><p class="medium-feed-snippet">A bit on type inference and type casting</p><p class="medium-feed-link"><a href="https://blog.kotlin-academy.com/what-do-the-is-and-as-keywords-in-kotlin-mean-1d496f4483cc?source=rss-e694d0fbbd8a------2">Continue reading on kt.academy »</a></p></div>]]></description>
            <link>https://blog.kotlin-academy.com/what-do-the-is-and-as-keywords-in-kotlin-mean-1d496f4483cc?source=rss-e694d0fbbd8a------2</link>
            <guid isPermaLink="false">https://medium.com/p/1d496f4483cc</guid>
            <category><![CDATA[kotlin-programming]]></category>
            <dc:creator><![CDATA[Besong-Anong Ernest Egbenchong II]]></dc:creator>
            <pubDate>Wed, 28 Feb 2024 00:51:47 GMT</pubDate>
            <atom:updated>2024-12-03T09:52:02.472Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Custom Class Properties in Kotlin.]]></title>
            <link>https://medium.com/@besonganongernest/custom-class-properties-in-kotlin-82d307bc78d2?source=rss-e694d0fbbd8a------2</link>
            <guid isPermaLink="false">https://medium.com/p/82d307bc78d2</guid>
            <category><![CDATA[kotlin]]></category>
            <category><![CDATA[property]]></category>
            <category><![CDATA[getters-and-setters]]></category>
            <dc:creator><![CDATA[Besong-Anong Ernest Egbenchong II]]></dc:creator>
            <pubDate>Tue, 21 Nov 2023 02:31:44 GMT</pubDate>
            <atom:updated>2023-11-21T02:31:44.180Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*CdJiKhAGvThoqy5C" /><figcaption>Photo by <a href="https://unsplash.com/@louis993546?utm_source=medium&amp;utm_medium=referral">Louis Tsai</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>Introduction.</h3><p>In Kotlin, we declare variables with the <strong>val</strong> or <strong>var</strong> keywords:</p><pre>val name = &quot;Jane Doe&quot; // Read only variable (value cannot be changed)<br><br>var age = 18 // Read-Write variable (value can be changed)</pre><p>Let’s use these variables to construct a <strong>Person </strong>class:</p><pre>class Person(val name: String, var age: Int)</pre><p>In the <strong>Person </strong>class constructor, <strong>name </strong>and <strong>age</strong> are called <strong>properties.</strong> Properties are attributes of a class.</p><p>We can create a person from <strong>Person</strong> class like so:</p><pre>val person1 = Person(name=&quot;Jones&quot;, age=23)</pre><p><strong>person1</strong> has the name Jones and is 23 years old.</p><p>Every class property has a field (variable) that stores the property value, a corresponding getter to access the value of a read-only property,<strong> </strong>or a corresponding <strong>getter and setter</strong> to access and update the value of a <strong>writable property.</strong></p><p>These getters and setters are called A<strong>ccessors</strong> and are built into the Kotlin programming language.</p><p>To access <strong>person1 name</strong>, you can write the code:</p><pre>person1.name // &lt;-- generates a getter</pre><p>Accessing <strong>person1 </strong>name<strong> </strong>generates a <strong>getter</strong> because the <strong>name</strong> property is read only.</p><p>To update <strong>person1 age</strong>, you can write the code:</p><pre>person1.age = 24 // &lt;-- generates a getter, and setter</pre><p>Updating <strong>person1 age</strong> generates a <strong>getter and setter</strong> because <strong>age</strong> is a <strong>read-and-write property</strong>.</p><h3>Example 1: Custom getter.</h3><p>What if we want to compute another property of a class from the properties in its constructor? — we can accomplish that using a <strong>custom getter.</strong></p><p>Imagine we want to verify that <strong>person1</strong> is an adult. To do this, we can create a <strong>custom setter</strong> on a property, <strong>isAdult</strong>, like so:</p><pre>class Person(val name: String, var age: Int) {<br><br>    val isAdult: Boolean<br>        get() {<br>            return age &gt;= 18<br>        }<br>}</pre><p>In the code above:</p><ol><li>We initialized the <strong>isAdult</strong> property with a <strong>Boolean</strong> type.</li><li>We created a <strong>custom getter</strong> using the <strong>get() { } syntax</strong>. Within the braces, we return a boolean value of true or false depending on the value of <strong>age</strong>.</li></ol><p>To check that <strong>person1</strong> is an adult, you can access the <strong>isAdult </strong>property as you did for <strong>name</strong> or <strong>age</strong>:</p><pre>person1.isAdult</pre><p>Like the <strong>name</strong> property, the<strong> isAdult</strong> property has a corresponding backing field that stores its value every time it is called. Therefore, there is no use in creating another field to hold the value.</p><h3>Example 2: Custom getter and setter.</h3><p>Let’s look at another example.</p><p>To begin, let’s construct an <strong>Employee</strong> class:</p><pre>class Employee(<br>    val employeeId: Int,<br>    val name: String,<br>    var status: Status<br>)</pre><p><strong>Employee</strong> has read-only properties: <strong>employeeId</strong> and <strong>name</strong>; and writable property <strong>status</strong> of type <strong>Status</strong>.</p><p><strong>Status</strong> is a class defined as:</p><pre>enum class Status(val hoursPerWeek: Int) {<br>    FullTime(40), PartTime(20)<br>}</pre><p>The role of <strong>status</strong> is to mark whether an employee works full-time or part-time.</p><p>Next, let’s construct an <strong>Organization</strong> class:</p><pre>class Organization(var name: String, val employees: MutableList&lt;Employee&gt;)</pre><p><strong>Organization</strong> has a mutable property, <strong>name</strong>, and read-only property: <strong>employees</strong>.</p><p>To create an organization:</p><p>First, define multiple employees using the <strong>Employee</strong> class:</p><pre><br>val employee1 = Employee(<br>        employeeId = 1,<br>        name=&quot;Bob&quot;,<br>        status = Status.FullTime)<br><br>    val employee2 = Employee(<br>        employeeId = 2,<br>        name=&quot;Jane&quot;,<br>        status = Status.PartTime)<br><br>    val employee3 = Employee(<br>        employeeId = 3,<br>        name=&quot;Bill&quot;,<br>        status = Status.PartTime)<br><br>    val employee4 = Employee(<br>        employeeId = 4,<br>        name=&quot;Chloe&quot;,<br>        status = Status.FullTime)</pre><p>Then, assign a mutable list of our predefined employees to <strong>employees</strong> property:</p><pre>val shield = Organization(<br>        name = &quot;Shield Corp.&quot;,<br>        employees = mutableListOf(employee1, employee2, employee3, employee4)<br>    )</pre><p>Imagine we want to access full-time employees from <strong>shield</strong>. We can achieve that using a <strong>custom getter</strong>:</p><pre>class Organization(var name: String, val employees: MutableList&lt;Employee&gt;) {<br><br>    // private backing field for fullTimeEmployees property<br>    private val _fullTimeEmployees =<br>        employees.filter { employee -&gt; employee.status == Status.FullTime }<br><br>    val fullTimeEmployees: List&lt;Employee&gt;<br>        get() = _fullTimeEmployees<br>}</pre><p>The code above uses the <strong>_fullTimeEmployees </strong>field or variable to store the value of <strong>fullTimeEmployees</strong>. <strong>_fullTimeEmployee</strong> is called a <strong>backing field.</strong></p><p>To print employees with full-time status from <strong>shield</strong>, you can do this:</p><pre>// print only full time employees in shield corp<br>    shield.fullTimeEmployees.forEach {employee -&gt;<br>        println(employee.name)<br>    }</pre><p>The output will be:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/182/1*wTJOUDL4dXzqXynmI_DCMQ.jpeg" /></figure><p>What if we want to hire full-time employees? What if we want <strong>fullTimeEmployees</strong> to handle the addition of full-time employees in our organization?</p><p>You can achieve such a feat with a <strong>custom setter</strong>:</p><pre>class Organization(var name: String, val employees: MutableList&lt;Employee&gt;) {<br><br>    // private backing field for fullTimeEmployees property<br>    private var _fullTimeEmployees =<br>        employees.filter { employee -&gt; employee.status == Status.FullTime }<br><br>    var fullTimeEmployees: List&lt;Employee&gt;<br>        get() = _fullTimeEmployees<br>        set(value) {<br>            when {<br>                value.isEmpty() -&gt; println(&quot;$name needs Employees!.&quot;)<br><br>                value.all{employee -&gt; employee.status == Status.FullTime } -&gt; {<br>                        _fullTimeEmployees = value<br>                        employees.addAll(_fullTimeEmployees)<br>                        println(&quot;$name recruited full-time employees&quot;)<br>                    }<br><br>                value.any { employee -&gt; employee.status == Status.PartTime } -&gt; {<br>                        println(&quot;Unfortunately, $name only needs full-time employees&quot;)<br>                    }<br>            }<br>        }<br>}</pre><p>Three things are worth noting:</p><ol><li><strong>_fullTimeEmployees </strong>is now a mutable backing field because we want to change its value.</li><li><strong>fullTimeEmployees</strong> is now a mutable property because we want to implement our <strong>custom setter</strong> logic.</li><li>The custom setter syntax: <strong>set(value) {}</strong> to update the value of <strong>fullTimeEmployees.</strong></li></ol><p>Within the braces, assigning a list of employees to fullTimeEmployees will change the value of <strong>_fullTimeEmployees</strong> and update the <strong>employees</strong> property if the list only consists of full-time employees.</p><p>To test our <strong>custom setter</strong>:</p><p>First, we will assign a list of full-time employees to <strong>shield’s</strong> <strong>fullTimeEmployees</strong> property as its value:</p><pre>shield.fullTimeEmployees = listOf(<br>        Employee(<br>            employeeId = 10,<br>            name = &quot;Mark&quot;,<br>            status = Status.FullTime<br>        ),<br><br>        Employee(<br>            employeeId = 11,<br>            name = &quot;Sherley&quot;,<br>            status = Status.FullTime<br>        )<br>    )</pre><p>Next, we will print the names of full-time employees from <strong>shield’s employees</strong> property:</p><pre>println(&quot;=========Full TIME AGENTS OF SHIELD===================&quot;)<br>    shield.employees.forEach {employee -&gt;<br>        if (employee.status == Status.FullTime) {<br>            println(employee.name)<br>        }<br>    }</pre><p>This will return:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/900/1*7P0sRaql0rOzmRIt2FHZUQ.jpeg" /></figure><p>That’s It!</p><h3>TL;DR:</h3><ul><li>Properties are attributes of a class.</li><li>Properties, like variables, are declared with the <strong>val</strong> or <strong>var</strong> keyword.</li><li>When you declare a property, you declare its getter and setter.</li><li>Custom properties are computed from other properties of a class.</li><li>Use <strong>get() { } </strong>syntax to specify the getter of a custom property.</li><li>Use<strong> set(value) { } </strong>syntax to specify the setter of a custom property.</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=82d307bc78d2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Code your UI with Jetpack Compose on Android.]]></title>
            <link>https://medium.com/@besonganongernest/code-your-ui-with-jetpack-compose-on-android-743f9212c9f?source=rss-e694d0fbbd8a------2</link>
            <guid isPermaLink="false">https://medium.com/p/743f9212c9f</guid>
            <category><![CDATA[jetpack-compose]]></category>
            <category><![CDATA[ui-design]]></category>
            <category><![CDATA[android]]></category>
            <dc:creator><![CDATA[Besong-Anong Ernest Egbenchong II]]></dc:creator>
            <pubDate>Wed, 04 Oct 2023 02:00:37 GMT</pubDate>
            <atom:updated>2023-10-04T02:00:37.117Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*laPHGb0m7rjqQRB1" /><figcaption>Photo by <a href="https://unsplash.com/@hana_k?utm_source=medium&amp;utm_medium=referral">Hana</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h3>Introduction.</h3><p>In this blog post, we will learn to create a composable UI on Android.</p><p>By the end of this post, you will have the skills to convert your designs to Android using Jetpack Compose.</p><h3>Prerequisite.</h3><ul><li>Basic understanding and usage of Jetpack Compose elements, Layouts, and Modifiers.</li><li>The <a href="https://github.com/Besong/LazaShop">Source code</a> for this article.</li></ul><h3>The Design.</h3><p>We will build this UI:</p><figure><img alt="Screen 8 of Laza Design by Abid Akram." src="https://cdn-images-1.medium.com/max/1024/1*7qoUF8A6GzxJ5NCCej7rsA.jpeg" /></figure><p>When creating this design, we will not include the <strong>BottomNavigation</strong> <strong>Bar</strong> as it is a material design component.</p><p>Let&#39;s explore the steps needed to convert the design to a composable UI.</p><h3>The Steps.</h3><h4>1. Break the Design into Modular parts.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/664/1*bYhD7ZeA48yCTV-OuyNUuQ.png" /></figure><p>The green bounding boxes are called <strong>Modules</strong>. A module is a composable UI element that is part of the screen.</p><p>You can find modules by navigating to <strong>ui/screens/WelcomeScreen.kt.</strong></p><p>In code, we declare a module as:</p><pre>@Composable<br>private fun ModuleName(modifier: Modifier = Modifier) {<br><br>}</pre><p>For example, we declare the <strong>TopAppBar </strong>module as:</p><pre>@Composable<br>private fun TopAppBar(modifier: Modifier = Modifier) {<br><br>}</pre><p>The <strong>private </strong>keyword ensures that the module is used only in the <strong>WelcomeScreen.kt</strong> file— the principle of Encapsulation.</p><p>View the source code in <strong>Project View</strong> and navigate to the <strong>ui/screens/WelcomeScreen.kt</strong> file to locate modules declaration. You don&#39;t need to worry about each module&#39;s content right now. You can explore them later.</p><h4>2. Identify Common Composables.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/266/1*VV7CBunDWoDoE-oa48qapQ.png" /></figure><p>Common Composables are reusable building blocks comprising our modules shown in blue bounding boxes.</p><h4>3. Build Common Composables.</h4><p>Unlike Modules, common composables are without a <strong>private </strong>keyword. Multiple modules and screens can customize these components using their modifiers or parameters.</p><p>For example, <strong>CustomIcon</strong> composable has implementation:</p><pre>@Composable<br>fun CustomIcon(<br>@DrawableRes icon: Int,<br>backgroundShape: Shape,<br>size: Dp,<br>color: Color,<br>modifier: Modifier<br>) {<br> Box(<br>        modifier = modifier<br>            .size(size)<br>            .clip(backgroundShape)<br>            .background(color = color)<br>    ) {<br>        Image(<br>            painter = painterResource(id = icon),<br>            contentDescription = &quot;&quot;,<br>            modifier = modifier.align(Alignment.Center))<br>    }<br><br>}</pre><p><strong>CustomIcon</strong> can be any icon with a background shape, size, or color by assigning values to the parameters <strong>icon,</strong> <strong>backgroundShape,</strong> <strong>size</strong>, and <strong>color</strong>.</p><p>Open the source code in <strong>Project View</strong>. Look at the reusable components found under the <strong>ui/components</strong> package and examine them individually.</p><h4>4. Combine composables to create modules.</h4><p>Let&#39;s combine our reusable components with the essential elements of Jetpack Compose inside of layouts while tweaking their modifiers to build the modules.</p><p>For example, the <strong>ChooseBrand</strong> composable module positions the list of <strong>BrandItems </strong>horizontally using a <strong>Row</strong> and places the <strong>SectionHeader</strong> and BrandList vertically using a <strong>Column</strong>.</p><pre>@Composable<br>private fun ChooseBrand(<br>    modifier: Modifier = Modifier<br>) {<br><br>    Column(<br>        modifier = modifier<br>    ) {<br><br>        SectionHeader(name = &quot;Choose Brand&quot;, modifier = Modifier)<br><br><br>        // BrandList<br>        Row(<br>            modifier = Modifier.horizontalScroll(rememberScrollState())<br>        ) {<br><br><br>            BrandItem(<br>                brand = R.string.adidas,<br>                icon = R.drawable.adidas,<br>                modifier = Modifier.padding(start = 5.dp))<br><br>            BrandItem(<br>                brand = R.string.nike,<br>                icon = R.drawable.nike,<br>                modifier = Modifier)<br><br>            BrandItem(<br>                brand = R.string.fila,<br>                icon = R.drawable.fila,<br>                modifier = Modifier)<br><br>            BrandItem(<br>                brand = R.string.puma,<br>                icon = R.drawable.puma,<br>                modifier = Modifier)<br><br>        }<br>    }<br><br><br>}</pre><p>We use the <strong>Modifier.horizontalScroll(rememberScrollState())</strong> to enable scrolling.</p><p>View the source code in <strong>Project View</strong> and navigate to <strong>ui/screens/WelcomeScreen.kt </strong>file to see each module implementation.</p><h4>5. Combine Modules to complete the Design.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/614/1*UhSEK0Cy4I7OPuxNTGb4-g.png" /></figure><p>Finally, we will create a new <strong>WelcomeScreenContent </strong>module by combining our existing modules. This module will include the content for the <strong>WelcomeScreen</strong>.</p><p><strong>WelcomeScreen</strong> is an app entity, and it is essential to expose the Screen, not its content. We do this to ensure the application is appropriately composed, with <strong>WelcomeScreen</strong> being a part of the entire app.</p><p>Another reason for the abstraction is to apply app-related settings to <strong>WelcomeScreen.</strong> For example, by placing <strong>WelcomeScreenContent</strong> inside <strong>Surface </strong>with the modifier parameter set to <strong>fillMaxSize</strong>, <strong>WelcomeScreen</strong> fills the entire space.</p><p>Navigate to <strong>ui/screens/WelcomeScreen.kt </strong>file and check out the full implementation of <strong>WelcomeScreenContent</strong> composable.</p><h3>Conclusion.</h3><p>Do not forget to place <strong>WelcomeScreen</strong> inside the <strong>setContent{} </strong>block in <strong>MainActivity.kt.</strong></p><p>To interact with the screen, run the app, and you should see this:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2Fot07emiM9IBdutdftO%2Ftwitter%2Fiframe&amp;display_name=Giphy&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2Fot07emiM9IBdutdftO%2Fgiphy.gif&amp;image=https%3A%2F%2Fi.giphy.com%2Fmedia%2Fot07emiM9IBdutdftO%2Fgiphy.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="893" frameborder="0" scrolling="no"><a href="https://medium.com/media/ba8c827107e5842183f3bd3fa2e1adaf/href">https://medium.com/media/ba8c827107e5842183f3bd3fa2e1adaf/href</a></iframe><h3>Resources.</h3><ul><li>Laza Figma file.</li></ul><p><a href="https://www.figma.com/community/file/1245385141730558466/laza-ecommerce-mobile-app-ui-kit">Laza - Ecommerce Mobile App UI Kit | Figma Community</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=743f9212c9f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Introduction to Jetpack Compose]]></title>
            <link>https://medium.com/@besonganongernest/introduction-to-jetpack-compose-6e8422836a9b?source=rss-e694d0fbbd8a------2</link>
            <guid isPermaLink="false">https://medium.com/p/6e8422836a9b</guid>
            <category><![CDATA[jetpack-compose]]></category>
            <category><![CDATA[concept]]></category>
            <category><![CDATA[introduction]]></category>
            <dc:creator><![CDATA[Besong-Anong Ernest Egbenchong II]]></dc:creator>
            <pubDate>Thu, 20 Jul 2023 17:32:52 GMT</pubDate>
            <atom:updated>2023-07-20T17:32:52.246Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*4Q3HK8FX28_bxjqk" /><figcaption>Photo by <a href="https://unsplash.com/@medbadrc?utm_source=medium&amp;utm_medium=referral">Med Badr Chemmaoui</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>User interfaces are essential for every Android app. They serve as the medium through which your users interact with your app. When built right, users are delighted as they use your app. If not, it will lead to bad user experiences.</p><p>And we know developing interfaces on Android is more challenging than our users might think. Let me introduce you to Jetpack Compose to simplify and accelerate this process.</p><h3>What is Jetpack Compose?</h3><p>Jetpack Compose is the new toolkit to build native UIs for Android. The name is derived from the combination of “Jetpack” and “Compose.”</p><p><strong>Jetpack</strong> are libraries to help Android developers build apps consistent across Android devices and versions using best practices and consistent codebases.</p><p><strong>Compose</strong> is a component of Jetpack that simplifies the process of creating user interfaces on Android devices. The name comes from the Object Oriented Principle of <strong>Composition</strong>.</p><p>In other words;</p><blockquote>Jetpack Compose is a modern library or framework for building native UI on Android using Composition.</blockquote><h3><strong>Why Jetpack Compose?</strong></h3><h4>1. Declarative over Imperative thinking.</h4><p>The hardest part about building a UI is how it changes or updates over time. For such changes to happen, the following must occur:</p><ul><li>Views that make up the UI should capture users’ specific actions, gestures, or events.</li><li>Update the UI state in response to user-generated events.</li><li>Update the UI to represent the new state.</li></ul><p>Traditionally, you can use imperative thinking in Android to perform such changes. Imperative programming uses functions to describe <strong><em>how</em></strong> the UI should look when data or state changes.</p><blockquote>By being imperative, you tell the UI to do what you want or show the views you need.</blockquote><p>Below is a profile screen in two different states:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*85HS1iHwOAeRt3Iu465rJw.jpeg" /><figcaption>Profile Screen in two other states.</figcaption></figure><p>Using imperative thinking, the code to render the user profile might be:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/44e2d83f20789384f35fd3415371be90/href">https://medium.com/media/44e2d83f20789384f35fd3415371be90/href</a></iframe><p>You must handle 12 “if statements” to display the user profile. If you forget one if statement, the user profile will render an incorrect UI.</p><p>With Jetpack Compose, you use the declarative approach.</p><blockquote>By being declarative, you describe <strong>what</strong> the UI should be, rather than<strong> how</strong> the UI should look.</blockquote><p>When displaying the user profile to the left, declarative programming would show a red follow button rather than make the follow button have a red background.</p><p>The user profile would be declared in Jetpack Compose as:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/9c856d05ff2b4bf4efc276091f892e5d/href">https://medium.com/media/9c856d05ff2b4bf4efc276091f892e5d/href</a></iframe><h4>2. Composition over Inheritance.</h4><p>Inheritance is a programming pattern where a child class inherits the properties or behaviors of a parent class. The original Android UI toolkit is built on the principle of Inheritance.</p><p>Take a look at the image below.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/964/1*lq2Up42h9dvYmBQqKKx3jA.png" /><figcaption>ImageButton Inheritance Tree</figcaption></figure><p>ImageButton is a child widget of ImageView, and so is ImageView to View and View to Object. This means methods of ImageView are methods of ImageButton.</p><p>It would take a lot of work to build and maintain a custom ImageButton due to the many parent methods you must re-implement.</p><p>Jetpack Compose is built on Composition.</p><p>Composition is a principle in object-oriented programming that says that classes should achieve different behaviors and code reuse by containing instances of other classes to implement the desired functionality.</p><blockquote>In Jetpack Compose, Composition will mean that you can build your UI by using multiple classes rather than inheriting a single class.</blockquote><p>An ImageButton can be built in Jetpack Compose as such:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f979254f8619b563c6f1b5aabadf5049/href">https://medium.com/media/f979254f8619b563c6f1b5aabadf5049/href</a></iframe><p>ImageButton contains Icon() and Box() components, both pre-built widgets offered by Jetpack Compose.</p><p>This makes building complex views easy because there are compositions of other views. Also, there is code reusability. Just as Icon() and Box() are used to build ImageButton composable, ImageButton() can likewise be used to implement another widget.</p><h4>3. Encapsulation over Callbacks.</h4><p>There are two things to think about when building UIs on Android:</p><ul><li>Which view you’d use to display any given data?</li><li>Who is responsible for data changes?</li></ul><p>The Android UI toolkit has widgets that assume both roles. While it’s evident that views should display states, it is not to have them manage states. Views managing data changes (states) implement callbacks or listeners in the form of interfaces.</p><p>For instance, TextView, used to display text, has the <strong>addTextChangedListener </strong>callback that tells you whenever the text has been changed. But the changes to the text can be from the user or another source.</p><p>Jetpack Compose decouples components responsible for displaying state from parts responsible for updating state by embracing Encapsulation.</p><blockquote>Encapsulation is a concept in object-oriented programming(OOP) that hides class implementation from other parts of a computer program.</blockquote><p>Using this concept means your UI will represent the state and isn’t responsible for managing the state.</p><p>Imagine building a simple contact list:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6mhQ0X3XgpyKbcTGOWgprQ.png" /><figcaption>Simple Contact List.</figcaption></figure><p>Contact is a state, defined in Kotlin as:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/7eac95aa001ca363ed017d74a962ae00/href">https://medium.com/media/7eac95aa001ca363ed017d74a962ae00/href</a></iframe><p>Using Jetpack Compose, you create a Contact composable like this:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/709a3e486b7387c94a3de7461c3c2e47/href">https://medium.com/media/709a3e486b7387c94a3de7461c3c2e47/href</a></iframe><p>Here, your Contact Composable or widget displays each Contact and has nothing to do with updating the Contact.</p><h4>4. Separation of Concerns: Cohesion over Coupling.</h4><p>Building a simple Android UI requires defining a layout in XML and inflating it into a Kotlin or Java Object. Making the UI responsive requires that you connect it with your business logic.</p><p>While this allows you to see your UI in action, the lengthy process goes against a concept known as <strong>Separation of Concern.</strong></p><blockquote>Separation of Concern is a design principle that suggests that you should separate your program into distinct sections with each section addressing a distinct concern.</blockquote><blockquote>A concern is a set of information that affects the code of a computer program.</blockquote><blockquote>It could be as general as the hardware on which you run your app, or as specific as the name of which class to instantiate.</blockquote><p>If you have always heard that you should separate your business logic from your UI logic, that is a separation of concern.</p><p>Separation of Concern has two main concepts: <strong>Cohesion and Coupling. </strong>To better understand these concepts, imagine an app to be a group of modules, and each module contains many units.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/589/1*Oxp-m1yaY7ntgYYdBRX7Lw.png" /><figcaption>An app is a collection of modules with many units.</figcaption></figure><p>Dependencies between modules would represent <strong>Coupling</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/588/1*RL-WDYd5c8n3f0QlenvmCw.png" /><figcaption>Coupling</figcaption></figure><p>On the other hand, interactions between units in a module would describe <strong>Cohesion</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/588/1*Ih2ZW-66k0hmiECm3Te_EQ.png" /><figcaption>Cohesion</figcaption></figure><blockquote>The goal is to group related code as much as possible(reduce coupling and increase cohesion). This way, your code is maintainable over time and scales as your app grows.</blockquote><p>By design, implementing a UI in Android encourage implicit dependencies between the layout written in XML and the business logic written in Kotlin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/588/1*_49lnkUKYxBJ1jiab0GfKg.png" /><figcaption>Modules implementing the Android UI by way of implicit dependency.</figcaption></figure><p>Implicit dependency is not by your own doing but by how the Android UI framework is designed—such dependency results from the language difference between the modules, hence, a forced line of separation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/576/1*C6BDJciFedmr7Sfv9UAG3w.png" /><figcaption>Force line of separation.</figcaption></figure><p>This forced line of separation disappears in Jetpack Compose because everything is written in Kotlin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/576/1*hLIplGOeVDE-7wwgYy2tcA.png" /><figcaption>Control line of separation.</figcaption></figure><p>Jetpack Compose is built with the idea that a framework should not separate your concerns for you. You should be able to decide where to draw the line of separation, depending on what makes sense for your situation.</p><p>This means that the implicit dependencies you had between your layout and business logic now become explicit.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/588/1*c0ysAKGYghFaE7mQ-MrFYQ.png" /><figcaption>Explicit dependencies.</figcaption></figure><p>Another benefit of having your UI and business logic written in Kotlin is that you can refactor those explicit dependencies to reduce Coupling and increase Cohesion.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/516/1*KMWzPvz4lmczRQTbeStIHg.png" /><figcaption>Refactored explicit dependencies.</figcaption></figure><h3>Components of Jetpack Compose.</h3><p>There are several components that makeup Jetpack Compose. These components can be placed into two distinct parts we shall call <strong>hosts</strong>.</p><h4>1. Development host</h4><p>The first part contains all the tools that would help you write composables. They are:</p><ul><li><strong>Kotlin Compiler: </strong>Jetpack Compose is written in Kotlin and uses many features, like trailing lambdas and commas, so it is easy to build your UI.</li><li><strong>Compose Compiler Plugin:</strong> If you have noticed, every compose code is a function that begins with the <strong>@Composable </strong>annotation. This plugin translates those annotations to UI-specific code for Android to render on the screen.</li><li><strong>Android Studio:</strong> As the preferred IDE for Android development, it offers specific tools that make building with Compose easy.</li></ul><h4>2. Device host.</h4><p>The second part contains the components necessary to run compose code on your device. Those components are:</p><ul><li><strong>Compose Runtime:</strong> Compose logic doesn’t know anything about Android or UIs. It only knows how to work with tree structures to emit specific items. The runtime provides an entry point for the compose compiler to understand the tree structure and emit UIs or other UI-related things like animations.</li><li><strong>Compose UI Core: </strong>It handles interaction with the device, such as layout, drawing, measurement, and input management.</li><li><strong>Compose UI Foundation:</strong> It contains essential building blocks like Text, Button, Row, Column, and other default interactions.</li><li><strong>Compose UI Material:</strong> An implementation of the Material Design System. It provides Material components, making using Material Design in your app easy.</li><li><strong>Compose UI Material 3:</strong> Implementing the Material Design 3 system, the new Material Design on Android 12 and higher. It provides Material 3 components, making using them in your app easy.</li><li><strong>Compose UI Animation: </strong>It includes components for adding animations to your app.</li></ul><h3>Resources</h3><p>Now that you know what Jetpack Compose is, its components, and how different it is from the Old Android UI toolkit, these resources should help you learn how to build interfaces using the framework.</p><p><strong>Setup:</strong> To use Jetpack Compose in a new or existing Android app, check out:</p><p><a href="https://developer.android.com/jetpack/compose/setup">Quick start | Jetpack Compose | Android Developers</a></p><p><strong>Playgrounds:</strong> To delve right into experimenting with the different device components, check out:</p><p><a href="https://foso.github.io/Jetpack-Compose-Playground/">Overview - Jetpack Compose Playground</a></p><p><strong>Codelabs: </strong>If you enjoy a step-by-step approach, here are two codelabs that cover the basics of the framework:</p><ul><li><a href="https://developer.android.com/codelabs/jetpack-compose-basics#0">Jetpack Compose basics | Android Developers</a></li><li><a href="https://developer.android.com/codelabs/jetpack-compose-layouts#0">Basic layouts in Compose | Android Developers</a></li></ul><p><strong>Samples:</strong> There are sample projects that you should follow through if you fancy how to build full apps with the framework.</p><p><a href="https://github.com/android/compose-samples">GitHub - android/compose-samples: Official Jetpack Compose samples.</a></p><p><strong>Courses: </strong>If you prefer a mix of different content materials(text, video, and codelabs) while earning badges and tracking your progress, here are courses provided by the Jetpack team that covers everything from having a material-designed app to building for different devices.</p><p><a href="https://developer.android.com/courses/jetpack-compose/course">Jetpack Compose for Android Developers</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6e8422836a9b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Beginner Freelance Software Developers: Beware of these 5 Common Mistakes]]></title>
            <link>https://medium.com/@besonganongernest/beginner-freelance-software-developers-beware-of-these-5-common-mistakes-75e616bd09a9?source=rss-e694d0fbbd8a------2</link>
            <guid isPermaLink="false">https://medium.com/p/75e616bd09a9</guid>
            <category><![CDATA[freelancing]]></category>
            <category><![CDATA[mistakes]]></category>
            <category><![CDATA[software-developer]]></category>
            <dc:creator><![CDATA[Besong-Anong Ernest Egbenchong II]]></dc:creator>
            <pubDate>Sun, 12 Mar 2023 08:41:30 GMT</pubDate>
            <atom:updated>2023-09-17T03:24:19.472Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*wiuDDv7mVkmebGnr" /><figcaption>Photo by <a href="https://unsplash.com/@silvawebdesigns?utm_source=medium&amp;utm_medium=referral">Nathan da Silva</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>As a software developer, it is likely that you have heard of the term “freelancing” and wondered what it is and whether it is a good fit for you or not. For the sake of this article, let’s assume this is your first encounter with the word and want to consider the option. So you pose the question, what is freelancing?</p><p><strong><em>Freelancing</em> </strong>is a term used to describe the act of offering one’s time and skills in exchange for money. The term is common and often used to describe anyone capable of working on their terms and for whoever. Though it sounds good when spoken about, especially with the powers you possess as a developer to conjure whatever software you decide, it is more complicated than you think if not approached with the right mindset.</p><p>In this article, I will go to length to highlight and explain common mistakes made by freelance software developers during their early stages. Also, I’d offer suggestions for avoiding such errors.</p><p>Whether you are thinking of shifting to freelancing or have been for a while, this article is for you.</p><h4><strong>Mistake #1: Freelancing is my job.</strong></h4><p>This is a common trait amongst most software developers and is more rampant for first-time freelancers. Having worked as an employee or not, there is this tendency to approach freelancing as though it is a regular job. Trading your time for money and taking orders from your new boss, all while doing this in the comfort of your location. Similar actions you tend to exhibit as employees, except for the choice of place in some sense.</p><p>You should instead act as an entrepreneur or, if that scares you, a solopreneur. As an entrepreneur, you should say:<em> Freelancing is my business.</em></p><p>By changing such a mind shift, freelancing becomes exciting, fulfilling, and a lifestyle you enjoy waking up and working towards. Also, you get to think differently about how you would price your services.</p><h4>Mistake #2: I do everything for every client. I can multitask.</h4><p>When you see freelancing as a job, you get to behave like a clueless employee to many new bosses. Ignorant in the sense that you don’t know that you are one. You become all capable and have no filter for your role and what it isn’t.</p><p>You can multitask, taking whatever is thrown at you to do. And that translates to the need to work tirelessly for every client by taking on tasks that you are not an expert in or don’t enjoy doing at all.</p><p>You are to think otherwise to avoid this mistake at all costs. And the way to go about it is by specializing. Taking on projects that match your skillset or doing that one thing you know to do well while seeking help on the things you are not so good at through delegation.</p><h4>Mistake #3: I have to make money. I’d take whatever deal walks the door.</h4><p>This might be your move for someone not sure about taking freelancing seriously. To work with whatever budget a client has to offer.</p><p>But if you decide to take a leap and be intentional, you must understand your worth and not settle for less. Remember, you are the entrepreneur. Money needs to be made that reflects your expertise and experience.</p><h4>Mistake #4: I would have little to deal with. There is more time for myself, my family, and my friends.</h4><p>I get it. 9–5 is tedious and time-consuming. Sitting at the office almost all day is exhausting and less fulfilling. But that won’t change much when you are just getting started in the world of freelancing.</p><p>Your ability to take initiative and be on top of things would be tested. And that takes time. You would have a lot of responsibilities because you are your employer.</p><p>Such responsibilities involve managing your clients and yourself, learning to market and make sales, paying your taxes, etc.</p><p>Knowing this, it is advisable to plan. To create time for your loved ones once you make the switch. You would likely work more hours as a freelancer, but the good news is you can do so on your schedule.</p><h4>Mistake #5: Freelancing platforms are my friends.</h4><p>In the tech world, the widely known freelancing platforms are<a href="https://www.fiverr.com/"> Fiverr</a> and <a href="https://www.upwork.com/">Upwork</a>. Such platforms are designed to help professionals like you begin your journey as a freelancer. However, they aren’t your friends. They aren’t intended to give you the life you want.</p><p>While they are filled with jobs and clients, there is no visibility into the decision process of any client to hire you. Moreover, they aim at cutting a percentage from any payment received(and yes, they deserve to).</p><p>I’d recommend using them for a start. To learn and gain some exposure and land your first few gigs.</p><h3>Conclusion.</h3><p>Phew!!. I know that was a lot to take in. Hopefully, I hope you enjoyed reading this work, and if there is one thing to take away from this article, it would be</p><blockquote>“When you think to freelance, think to become an entrepreneur”</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=75e616bd09a9" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>