Jetpack Compose: The Future of Android UI

Because of the declarative approach, developers can easily create rich and more complex UI faster and easier than before. There are less bugs, and the code is easier to maintain. Jetpack Compose follows a Unidirectional Data Flow design pattern and developers should try to make the Composables Stateless.

Jetpack Compose, as the future of Android UI was a topic we discussed during our last Mobile Forum. This meet-up is an internal forum of our Mobile team. During this session our Mobile Developers shared their experience about working with Jetpack Compose in one of their projects. 

In addition to this, we discussed Swift UI, which is something that we’ll go into more detail in our next week’s post.  

This week, here to tell us about the Android aspect of things is our Senior Mobile Engineer Kosta Cincaroski, who has more than 13 years of experience in the industry. He has been a part of our company for almost 4 years and is also a Consultant Manager. 

(Written by Kosta Cincaroski, Senior Mobile Developer) 

In the ever-evolving world of Android app development, creating and managing user interfaces has traditionally been done using XML layouts. While this approach has served us well for many years, it often brought along its own set of challenges. Now we have Jetpack Compose, a modern UI toolkit for building native Android user interfaces. As a developer who has had the privilege of working with Jetpack Compose on several projects, I can confidently say that it’s a game-changer.

Why Compose?     

Because of the declarative approach, developers can easily create rich and more complex UI faster and easier than before. There are less bugs, and the code is easier to maintain. Jetpack Compose follows a Unidirectional Data Flow design pattern and developers should try to make the Composables Stateless. If we consider a typical ViewModel architecture, Events will be passed to the ViewModel (Event Handler), state will be updated by ViewModel and as state is updated, the changes will be pushed to the composables, which will also trigger a recomposition. This can be demonstrated in the following example: 

So, when starting with Jetpack Compose always try to develop the Composables in Stateless manner. This means passing the data through arguments and try to avoid handling state in the Composables. This probably is a new approach and way of thinking for most Android developers, but if you have previous experience in other multi-platform frameworks, like React Native, you might find this similar and handy. The other developers within our team and I found it very useful.  

Here are some other advantages of Jetpack Compose that we found very useful:

  • Declarative UI – more intuitive and simplified UI code  
  • Reactive – UI is updated automatically based on the underlying data changes  
  • Productivity – Live previews are awesome   
  • Performance – Better rendering performances and smooth UX  
  • Modularity – Smaller reusable Composables can be made  
  • Gradual Adoption – We didn’t have to rewrite the whole code in Compose, but started using it for the new features 

Composition Vs. Recomposition   

The main catch that developers should understand and might find difficult at the beginning is that composition/recomposition should not be equated to a LifeCycle, as composable functions may be recomposed as often as every frame (i.e., during animation). Also, developers should be clear that composable functions may be called in any order and that they may be executed in parallel. Therefore, we should avoid a huge logic that executes when a Composable function is executed. This is sometimes referred to as Side-Effects. Recomposition (Composable function calling itself) is triggered when a change in the state is made, so the UI is updated with this latest state. This is quite handy as only the composables with state change will be recomputed, but not the other composables. This will make the app more efficient and make the code easier for testing.   

Stateless Vs. Stateful  

Although the goal is for the Composable functions to be Stateless, we sometimes need to make some Composables Stateful. So, when a composition is triggered during an initial composition, a value can be stored and later returned to the same value during the recomposition. This can be achieved by using ‘remember’. 

Composition also comes handy when we need to keep the same value between configurational changes like rotating the screen. 

Modifiers  

One of the best things introduced with Jetpack Compose are Modifiers. For a clearer representation of what they are, we can compare them to the good old xml Attributes, although they are not the same. I really like the fact that Modifiers are powerful as they allow you to decorate or pass arguments to the default implementation of the Composables. One thing to note here is that the order of Modifiers and how they are applied really matters. We can see this in action in the following example:

In classical xml implementation, implementation would need a more extensive code and probably at least two views. So, all hail the Modifier as it is indeed a game changer! 

Conclusion

To summarize this post, I would say that Jetpack Compose is the future of Android UI development and that all Android developers should start using it as soon as possible. Somebody might ask “What about refactoring the old views of an already existing project?”. This could be tricky, and it would depend on the complexity and implementation of your current project. But I would hardly recommend that all new features are developed with Compose.  

Compose is our definite choice for some of our older projects, and for new projects we are just starting. This post’s purpose is informational and shows how we use our internal domain focus groups to share knowledge. We often have similar meetups and knowledge sharing discussions for other domains as well. This post just scrapes the surface of the topic and hopefully we will expand it in some of our next posts. 

Explore more articles in this category

Consultant in focus Dorian Slavov – Nion’s first colleague in Bulgaria

Nion has assembled an incredible team, and being surrounded by such talent and passion is incredibly inspiring.

Explore
Consultant in focus Peter Dahlman – DevOps Engineer

I enjoy working at Nion because my vision, values and outlook on how we do business and deliver value for our clients are aligned.

Explore
Reference case Strategic partnership and cooperation with SRS since 2016

Svenska Retursystemet (SRS), owned by the big FMCG companies in Sweden – faced challenges.

Explore
Reference case New analytics platform and Data Warehouse for Rädda Barnen (Save the Children Sweden), ensuring well-informed decisions

Rädda Barnen, a leading global non-profit organization asked Nion for support.

Explore
Reference case Developing and maintaining a Data Warehouse for GANT

GANT, a well-known global retail brand, initiated a collaboration with Nion in early 2021.

Explore
Reference case Development of a functional and intuitive digital workspace together with Aize

Aize asked Nion for support in creating an intuitive and functional digital workspace, comprising a collection of tools.

Explore
Product Sharelock

With over 20 years of experience in the financial industry, we understand the critical importance of efficient and secure compliance processes.

Explore
Product GIVO

GIVO is innovative and sustainable platform designed to simplify and elevate your fundraising efforts.

Explore
Consultant in focus Filip Shulevski – Quality Assurance Engineer

At Nion, I’ve found more than just a job!

Explore
Consultant in focus Adam Kristensson – Talent Acquisition Specialist

The people are the core of a company and Nion knows this.

Explore

How can we help you?

Get in touch with us or find an office closest to you.