I was happy to give a German talk about “Wie sollten Java-Entwickler heute Front-Ends für Web, Mobile & Desktop bauen?” (“How Should Java Developers Build Front-Ends for Web, Mobile & Desktop Today?”) at the Java Forum Stuttgart 2021. It’s the biggest Java conference in the South-West of Germany and an online conference again this year.
Nutzer greifen heute mit PCs und Mobilgeräten auf Applikationen zu. Es gibt zwei offensichtliche Wege, Front-Ends für diese Geräte zu bauen: Web-Applikationen und native Applikationen. Cross-Platform-Lösungen kombinieren Vorteile beider Ansätze. Beispiele sind React Native von Facebook oder Flutter von Google. Für reine Web-Entwicklungen kommen React von Facebook, Angular von Google und Vue.js infrage. Ich betrachte all diese Frameworks vom Standpunkt eines Java-Entwicklers und empfehle Frameworks für drei typische Szenarien: Reine Web-Anwendung, native iOS-/Android-Apps und Umgang mit Desktop.
Im Sommer 2019 entwickelte ich einen mobilen App-Prototyp mit Flutter, im Winter einen Prototyp einer Progressive Web Application. Ich entschied mich danach, Flutter für native mobile Apps in Projekt zu verwenden, das im Mai 2021 in Produktion ging. Aus meiner Projekt-Erfahrung heraus schildere ich Vorzüge von Flutter, aber auch typische Probleme und deren Lösungen.
Users access applications on PCs and mobile devices today. There are two obvious ways to build front-ends for these devices: Web applications and native applications. Cross-platform UI toolkits combine advantages from both approaches. Examples are Google’s Flutter, JavaFX, Facebook’s React Native, and Microsoft’s Xamarin. Important web application frameworks are Google’s Angular, JSF, Facebook’s React, Thymeleaf, Vaadin, and Vue.js. I will look at all these toolkits from the perspective of a Java developer and suggest which one to use in three common scenarios.
In 2019, I developed a mobile app prototype with Flutter and a progressive web application prototype. I then decided to use Flutter for native mobile apps in a project that went live in May 2021. Based on my experiences, I will highlight typical Flutter issues and how to solve them.
I’m neither affiliated with the projects I’m discussing nor selling books or training courses. I share industry analysis and my project experiences to give you options for your next project. I use 12 criteria for my evaluation. You may use my criteria or pick your own or weigh my criteria differently than I do. But you need to apply your criteria in your own environment and make your own choices.
Here is my advice for “Neue Web-Anwendung (Building a Web App From Scratch)”:
Here is my advice on “Neue, Native iOS- & Android-Apps (Building Native iOS and Android Apps From Scratch)”:
And this is my advice on “Web-Anwendung da - was tun? (What to Do on Desktop When You Have a Web Application)”:
If you’ve seen my talk, then please rate it!
This is the feedback I got on my talk. Please note that you can view the second page with the arrow button in the bottom left.Here are the slides as PDF. They are 2.1 MB:
You can also get the slides in their original Keynote format. “Keynote” is Apple’s presentation application. Why would you do that? My slides have less text than the PDF version, so you can see what I cut. I also animated the slides, so they are more pleasant to watch. Or maybe you want to peek under the hood to see how I achieved specific effects. These slides are 13.8 MB in size.
Flutter Hot Reload makes code changes go live in the device/simulator immediately. It’s the main reason why working with Flutter can be such fun! I mentioned it in the talk. Here is a video demonstrating it.
Although it’s a bit old, this is still a decent example of what a native Flutter app can look like. I’m not ready to share the app I’m working on - sorry!
In the summer of 2019, I built native iOS/Android apps with Flutter to validate a business problem. It took me about six weeks, and it was my first Flutter project. I used Google’s cloud service Firebase for login, No-SQL database, and file storage. I also built my own back-end with Java, JHipster, Spring Boot, and Angular.
At the end of 2019, I built a progressive web app (PWA) to speed up app development. A PWA uses the “Service Worker” in a browser to install on your device and cache data. That was about four weeks, and it was my first PWA. I used Google Workbox for this but developed my own offline storage solution in the browser. I built my back-end with Java, JHipster, Spring Boot, and Angular.
And now for some shameless self-promotion: I’m looking to join a project in October 2022, in Milton Keynes, London, or remote. I’ll work as a contractor or fixed-term employee but don’t take permanent positions. Interested? Then check out my resume & work samples!
SwiftUI is Apple’s take on declarative front-ends. Here’s the counter example from the talk, with slightly changed formatting:
|
|
Flutter is Google’s cross-platform implementation of declarative front-ends. It reached the stable version 1.0 for mobile in December 2018. Here’s what the SwiftUI counter sample looks like in Flutter:
|
|
Jetpack Compose is Google’s Android implementation of declarative front-ends. So Google has two different horses in this race: Jetpack Compose and Flutter. Of course, it’s Google! 😒
Jetpack Compose went 1.0 on July 28, 2021.
I adopted the counter sample in this tutorial to look like the SwiftUI sample above:
|
|
.NET MAUI is part of .NET 6 and was recently delayed from November 2021 to Q2/2022. And if “Maui” rings a bell for you - it’s the second-largest island of Hawaii.
Microsoft calls its implementation of declarative front-ends “Model-View-Update” (MVU). Here’s what I think the SwiftUI sample from above will look like in MVU. I adapted the sample from the announcement post:
|
|
And finally, here’s what the counter looks like in Facebook’s React for web applications. I adapted it from this Stackblitz sample. You see some HTML code in there because I don’t use components to keep things simple. If I did, it would look as declarative as the other examples:
|
|
I recorded all numbers on August 25 & 26, 2021.
Here is the link for Google Trends: Angular, JSF, React, Vaadin and Vue.js. It shows how unpopular JSF and Vaadin are today. Thymeleaf is not on the list because Google only allows 5 search terms. Here’s a version with Thymeleaf instead of Vaadin.
Here is the link for Stack Overflow Trends with all frameworks: Angular, JSF, React, Thymeleaf, Vaadin and Vue.js. It shows how unpopular JSF, Thymeleaf, and Vaadin are today.
Here are the search queries for the Udemy course data:
The Indeed job search went across 63 countries representing 92% of the worldwide GDP in 2020. It is a full-text search in both the header and the body for the technology name, such as “Flutter”. In most countries, the result must also include at least one of multiple ways to say “developer”.
Here are some of the adjustments & caveats.
You can find the detailed search results with links here:
I ranked React fastest for two reasons:
I recorded all numbers on August 25 & 26, 2021.
Here is the link for Google Trends: Flutter, JavaFX, React Native and Xamarin. It shows how unpopular JavaFX and Xamarin are today.
Here is the link for Stack Overflow Trends with all frameworks: Flutter, JavaFX, React Native and Xamarin. It shows how unpopular JavaFX and Xamarin are today.
Here are the search queries for the Udemy course data:
Please see the previous section for general information on the Indeed search.
Flutter is at a special disadvantage on Indeed. Often, you find the following in job ads there: “Experience with a cross-platform framework like Xamarin or React Native required”. Now Flutter is a cross-platform framework, and it’s the new kid on the block. But if you just have “Flutter” in your resume, you still may not get the job:
These are the same search results as above:
Flutter gives us little help on responsive design: Find out the screen width and change your UI. Wonderful! So no grid, like in Bootstrap or the more powerful, but also more complicated HTML version. Anyway, I went with flutter_bootstrap for now.
The React website is a good starting point. React uses JavaScript to create web applications.
TypeScript mixes “some Java into JavaScript”, such as types. Hence the name! You have to use TypeScript if you use Angular. And you can use it with React.
You can take a peek in the “TypeScript for Java/C# Programmers” article. If you like it, then the TypeScript handbook is your friend, also in Epub and PDF.
The Flutter website is an excellent place to get familiar with Flutter. Flutter uses the Dart programming language to create natively-compiled applications for mobile, web & desktop. Both Flutter and Dart can use plugins that have a great portal.
You start with the Dart language tour. Java developers take the “Intro to Dart for Java Developers” next. Then you have options:
Here are the instructions, straight from the Flutter website:
Here’s a selection of Flutter tutorials and courses: