Show HN: I built a Flutter job app for both Android and iOS
With not much prior experience (my first big development project), I somehow managed to pull this off. The whole process took about 5 months, mainly coding on weekends and late nights. The app is built upon SwissDevJobs' API and is available on both mobile platforms. The entire deployment process went smoothly. I had heard many horror stories about the App Store and its strict review procedure, but my app was accepted on the first try, so I guess there's nothing to be afraid of :)
Here are some "technical" details and my observations: It wouldn't have been possible to build this without the support of the entire Flutter community and third-party packages. Many essential functionalities are missing in the framework itself. Otherwise, you'd find yourself delving into the dark void of native code. State management is pretty much non-existent, so you need to rely on external solutions - for me, it was Provider. Many people might initially be thrown off by the way Flutter uses endless nested widget trees. Trust me, after a few days, you'll fall in love with this approach. It's intuitive and pleasant to work with. Dart is one of the best languages out there. I've tried many of them, perhaps too many, and Dart easily ranks as one of my all-time favorites. It's clean, intuitive, and I hope it will gain more popularity beyond just being used in Flutter.
Check it out, and please share your thoughts. Happy to hear all feedback, so don't hold back. Any criticism is more than welcome, a man must learn somewhere :)
Android version: https://play.google.com/store/apps/details?id=ch.swissdevjobs.swissdevjobsAPP
iPhone version: https://apps.apple.com/us/app/swissdevjobs/id6467407240
[+] [-] Alifatisk|2 years ago|reply
I somewhat agree, Dart is good. Performs well and is very flexible. What I don't like is the lack of type union. I don't know how to get around that.
[+] [-] vasper|2 years ago|reply
Swift and Kotlin also do not have union types, and mobile developers somehow manage without them :D
[+] [-] brutus1213|2 years ago|reply
I know the old Java based Android and the old obj-c based ios but haven't bothered to get fresh on all the changes of the last 5 years (swift, kotlin, jetpack, etc). I have been considering the Flutter option as a cross-platform way to do quick prototyping. Any good learning resources you can suggest (books, sites, tutorials)? Any particular libraries (e.g. image loading/rendering, parsing, etc.) you can suggest? Anything to avoid that seemed low value?
[+] [-] vasper|2 years ago|reply
When it comes to libraries, I would recommend sticking with built-in features for tasks like image loading or parsing. This actually works quite well, and there's no need to delve into external solutions, especially for prototyping. Dart's factory methods come in handy for parsing JSON from an API, and the internal HTTP package is also very well done (for more advanced stuff there is a package called dio).
The main challenge lies in state management. Be sure to choose the right external stuff. The 'bloc' package seems to be the state of the art at the moment, but if you prefer something simpler, Provider is the way to go. The need for other libraries may become apparent after spending some time on the project.
Flutter is a great choice for quick prototyping. You can build something in a matter of minutes. Many people prefer this way over launching Figma, which says a lot :)
[+] [-] BrutalCoding|2 years ago|reply
It carries attention to details. For example the (hero?) transition from tapping on the searchbar to the searchbaroverlay is nice.
The SelectableText widgets in the Requirements section is a nice touch too. Can’t select the titles such as “Must” or “Nice to have:” but I guess that the content is what matters, which you made selectable.
Dropdowns look nice. Overall just positive in general, especially for someone that has been doing this on the side with no prior experience.
I’d recommend to look into Riverpod for state management instead of Provider, its from the same guy named Remi (author). Especially when you get the hang of the optional riverpod_generator companion plugin (again, same author). It’s basically a Provider 2.0 but due to many differences and breaking changes, he decided to go for a new name.
Some nitpicks: - Twitter logo and name is outdated (X now) - Typo in appbar title when in the Salary stats page, it should be “Salary Statistics” - Salary stats doesnt seem to want to load. Perhaps add a hardcoded timer e.g. display something like “This is taking longer than usual, please come back later.” after a min or so. (Edit: nvm, it loaded) - When tapping on any pages from the sidebar, the only one being “remembered” is the community one. That one gets highlighted in blue but it’s still blue after I visit other pages such as “Send feedback”
Anyways, great job. Keep at it.
[+] [-] vasper|2 years ago|reply
Actually, the transition from the searchbar is made using the animations package. Container transform, to be more specific: https://pub.dev/packages/animations
Regarding selectable text: I didn't want the titles to be selectable; instead, I aimed for the actual text provided by the companies to be selectable. However, there's one annoying bug with the SelectableText widget - in shorter texts, the widgets leave an empty space (one character long) before the actual content of the widget. I couldn't figure out how to bypass that, so I left it as a normal Text widget. If you place a SelectableText on top of or below a normal Text widget, the first one does not appear centered at all. Just one of those quirky Flutter things :)
For dropdowns, I use the Dropdown2 package - much, much better and more customizable compared to the standard, Flutter one.
I considered Riverpod for state management, but Provider seemed more appealing to me at that time, probably due to its simplicity. Someday I may switch to the Bloc approach just to see and get a grasp of how the big boys handle this.
For me, it will always be Twitter :(
The slow loading issue might be because you are based in Australia, and Cloudflare is taking some time to process the "connection". Sometimes it even blocks users from certain countries or regions. I don't know exactly how it works behind the scenes; it's completely not my cup of tea. But you're right, adding something like "This is taking longer than usual..." would be a great addition.
Thanks for all the feedback!
[+] [-] WomenCanCode|2 years ago|reply