We're sunsetting PodQuest on 2025-07-28. Thank you for your support!
Export Podcast Subscriptions
People
M
Mike Rydstrom
Topics
Mike Rydstrom: 我拥有丰富的编程经验,从早期的Commodore 64到大型国际公司的企业系统开发,再到如今专注于Flutter的Material Design主题定制。我开发了FlexColorScheme、FlexSeedScheme和FlexColorPicker等多个Flutter包,旨在简化Flutter应用的主题定制和颜色选择过程。FlexColorScheme提供了一个可视化的主题配置工具Themes Playground,方便开发者快速创建和调整应用主题。FlexSeedScheme则提供更精细的Material 3颜色方案生成控制,而FlexColorPicker则是一个功能强大的颜色选择器。在状态管理方面,我推荐轻量级的方案,如ValueNotifier、ChangeNotifier和ListenableBuilder,对于复杂场景,可以使用Signals。最后,我目前在HypeHype公司工作,这是一个基于Flutter的移动优先游戏平台,拥有35万行Flutter代码。 Philip Korn: 作为主持人,我引导Mike Rydstrom分享了他的职业经历、技术选择和开发经验,并对他的开源项目和Flutter社区贡献表示赞赏。

Deep Dive

Chapters
Mike Rydstrom, also known as MaterialMike, shares his extensive programming background, starting from the VIC-20 and Commodore 64 era through various languages and systems like Pascal, C, Visual Basic, and COBOL. His academic journey involved a master's degree in process engineering and computer science, leading to roles in management within multinational corporations.
  • Early programming experience with VIC-20, Commodore 64, and various languages.
  • Master's degree in process engineering and computer science.
  • Management roles in multinational corporations, including IT infrastructure and business systems development.

Shownotes Transcript

Translations:
中文

Hi, thanks for listening. This is the It's All Widgets Flutter podcast. My name is Philip Korn. Each episode, get a chance to speak with another amazing member of the Flutter community. This episode, we're extremely lucky to speak with Mike. Welcome. Thanks, Joao. It's a real pleasure to be here on the It's All Widgets podcast. I know we've been talking about it for ages, I think, a couple of years maybe that I should come on and have a chat. So it's a real pleasure to be here.

It's been too long. You're absolutely right. I've wanted to speak to you for a long time. Can you share about your background? Yeah, certainly. I have a little bit of a different background than maybe people think because I started coding back in the days, you know, when VIC-20 and Commodore 64s were a thing and stuff.

I later moved to CPM86 computer programming Pascal and that then became Turbo Pascal that I used on PCs along then later with C and Visual Basic and Delphi and a tiny bit of C++ as well. So that was a long time ago. I'm probably one of the older guys in the Flutter community.

So, and at university, when I started out, I had actually as a summer intern at a software company, did a lot of coding on digital Vax VMS systems as well. At uni, we used that as well, but mostly Pascal and Fortran and some Modular too. But as an intern at that company, I programmed for three summers in COBOL, believe it or not.

So that was a while ago, but it was still going strong. And that system was used by cities and municipalities for electric energy and district heating invoicing. So it was really ancient things, maybe not something that typical Flutter audience have even heard about. Kind of funny.

I ended up doing a master's degree in process engineering and computer science. So my thesis was about online monitoring and modeling of fermentation processes. We used a lot of interesting tools in building that. First, it was like a raw DOS app with C and lab windows, which has a precursor to LabVIEW, which might even still be around today.

But I later rewrote that in Visual Basic, supported by a few DLLs written in C and some serial interface apps for a lot of different equipment, lab equipment and monitoring equipment to get the online data. And believe it or not, those were also written in Visual Basic and it worked quite great. So yeah, that was quite exciting. The UI for that app was quite advanced for the time. And we also did some crazy things like experimenting with artificial neural networks, which

And this was a long time ago. And we just used simple back propagation to train some very simple networks for the modeling part. And yeah, it was very novel back then. And nobody probably ever thought that would go anywhere. And for tens and tens of years, it didn't. But now it's a hot thing. So that's pretty funny to see that you ended up doing that.

I once tried rewriting the artificial, the ANN sort of simple back propagation in Prolog, but that nobody could figure it out. Not even the instructor. I remember that we managed to get the forward propagation to work, but yeah.

So that was pretty interesting as a background. And a funny little tidbit of that is that I did my master thesis in the US for a Finnish-US joint venture company. So I spent three months in Rochester, New York, and three in San Francisco. And I did the sort of experimental part of that fermentation monitoring and modeling system there.

I later ended up working for that company for a number of years as well, and they moved their headquarters to Palo Alto, and I ended up visiting quite a few times. I do think they're still there. It's not far from Stanford University and very close to HP. It's not far away from Google's headquarters either, but it was so long ago that Google had not even been founded yet. Can you believe that? Yeah.

So I had this quite nerdy background and I ended up migrating to more management roles in big international corporations doing things like managing IT infrastructure, corporate business system, a lot of ERP, CRM implementations and their deployments worldwide. So I traveled a lot and I also managed development of in-house custom business systems, mostly to do with web front-end and integration for back-end systems.

They have like order fulfillment systems, manufacture to order processes and spare parts delivery system, which back then was a big new thing that everybody was doing and working on their supply chain optimizations like crazy.

So yeah at that time I'd got enough of coding for many years even I would say decades even. Sure it was I mean it was a hobby I used to tinker with things when I had time and but more like with controllers and embedded systems. So I had also a little bit of past of programming factory automation systems well one at least that was popular in Finland called Valmet Dramatic XD. It was

Pretty interesting to code since you basically wrote the codes by making AutoCAD drawings. Quite unique. So anyway, I had all this, you know, IT, ICT, manager, VP, CIO roles for a number of years. And most of the things I ended up doing was at the end of the day PowerPoint and talking and getting people to move in the directions that, you know, management team wanted or the board wanted to go. Or at least, you know, the rim of the quarter anyway.

So yeah, this was an interesting experience, but it was not very technical and also not very creative. So a number of years ago, I joined a small startup called Eneron. There we were building an energy management system for property managers or owners of large property portfolios, typically commercial and public buildings.

And that was a SaaS system based on the LAMP stack. Probably people are more familiar with this type of things because Linux, Apache, MySQL, PHP. And we had outsourced contract developers for building the system. So at that point, I was still hosting, managing the outsourced development as well. But yeah, eventually we ended up selling this company to a bigger operator. But before that happened, I was continuously looking for

new emerging technology stacks to rewrite this LAMP-based solution in. So I looked at various web stacks, but I was never a fan of everything that had to do with web development. Actually, come to think of it, this was one of the reasons I decided to move to more management roles and give up programming for many years. Web was making it entry and coding in it made me miserable. So I didn't like how you wrote code for that and

From my viewpoint, it was not a very delightful development experience. So I was happy to leave that to others that enjoyed it. And then I guess we are entering into Flutter, because that is how I ended up hearing about Flutter. I think this was around the same time, Hillel, that you were starting to look into Flutter as well, because I remember seeing you on Twitter in very early days of Flutter regarding invoice NEMEON.

Wow, that's a really interesting background. I also came from a web background and switched to Flutter. And I love the order of everything. Things started to make sense. It was a well-reasoned, well-thought-out system. So how did you get involved? So you hear about Flutter, then you just start messing around playing with it? Yeah, that's how I started as well. Like you said also, I came from very ordered and structured programming in the, you know, in the...

mini computers and partially also mainframes and this kind of environment and web kind of always frustrated me so that's why I gave it up but then I started as a part in this company looking at some technologies that we could move move the things that we had on the LAMP stack over to eventually so I I think with a lot of things I found a lot of different web frameworks that you know promised more delightful development experiences etc but none of them really clicked and the

Then just one day back in 2018, I came across Flutter. I think it was in beta 0.4 or 0.5, which sounds very early, but version one was actually released December 2018. So it was not so early on the Flutter train, but 2018 anyway. So I was looking for something that could be useful for rewriting this system that they were having and that

And of course, by then I'd been out of coding for a long time. So I just sort of said, okay, I'll just try to evaluate this and start building some things with it and learning how to use it. And I really found it to be

Very delightful to work from. The dark language was so nice and the Flutter framework was also really, really nice. It did kind of give me the same kind of feeling that you first had when you had Visual Basic to build a Windows app. It's like, oh, this is delightful and it just clicks. There was no UI tool to build a user interface, but the declarative coding and style for sort of painting the UI with code clicked in a similar way.

So yeah, that was quite an exciting feeling to start doing that. But of course, I hadn't been coding for years, so it took me quite a while to get familiar with everything that I had been missing for all those years that I didn't code myself. So that was a bit of a struggle, but it was still fun to get into it again. And I was doing it more like as a side thing to get up to speed on things.

So, yeah, but so it was really fun to get back into coding and feeling the creative process of it again. I really enjoyed that. Sure, you know, whipping up PowerPoints for corporate information system strategy presentations can be creative. All right, maybe not. There's a reason why there is a Dilbert comic strip about PowerPoint, death by PowerPoint poisoning. So, yeah.

But, you know, it was at least still fun to have had the opportunity to travel all around to, I think, probably around 30, 35 different countries where these different corporations operated in that I worked for for a number of years. So it's not something that was a bad experience, but it was just so refreshing to get back to creating things by coding again.

Cool. And then in the Flutter community, you're well known for your love and expertise of material or material design. What got that started? What got you so interested in it? Yeah, that is probably a fun story also. I'm pretty much known as Material Mike in the Flutter community. And I think it's an affectionate name and it's a funny one that was started in a presentation that I did recently.

did a local meet up at Volt I think it was Shatai who said that oh it's like material like and and that kind of started and after that I had actually gotten familiar with material design before I I started using Flucker so I I knew what it was a little bit and I was familiar with it because I have seen it used in a lot of web frameworks that I was looking at and the

It didn't look, you know, as flashy as a lot of those web designs did even back then. So back then it was more like, when I started looking at it, it was the bootstrap and the follow-ups from that that were taking off and the material looked kind of clunky.

So then when I started using Flutter, of course, I wanted to see how it was implemented, started looking at the code around it. And I was quite immediately frustrated by how difficult it was to team applications in Flutter. So I kind of wanted to see if I could set up some simplified ways to quickly style and get material team for Flutter apps to look and feel more like I wanted them to be.

And in the early Material 2 teaming, the styling was actually much more restricted and limited than it is now. But people, I guess, complained less and just accepted it. The Material 3 implementation in Flutter is actually much more teamable and stylable than the Material 2 one ever was.

However, there is a little bit of catch to that because Material 3 comes with what many consider much more opinionated defaults. Some probably even call it obnoxious defaults. So it takes a lot more effort to customize the Material 3 defaults to be more platform agnostic than it used to do with Material 2. So this is something that people have probably not gotten so used to either.

So I know in the community you're working on the Flex Color Scheme package. Can you explain how that's used? Yeah. Flex Color Scheme is what sort of came out of my little bit of frustration and my wish to make it easier for myself and then to share that thing that I created. So

Flex Color Scheme is a package to make material theme data. It didn't really start off as focused on all that. My first iteration was focused on setting all the color scheme colors correctly and applying them in the right way to the older Flutter versions to make both the light and dark themes look good. And as it was actually intended to look back then with the Material 2 design,

Back then, few knew that the default light and dark constructor for the material theme data did not actually create a correct material to design theme in how the color scheme colors was used on components and on the surface colors. Especially in the dark mode, this was very bad, the default constructor. So the first versions of the Flex color scheme just focused on, you know,

making all these color mappings correct and better by default the way it was intended to be. And that's sort of why the package got this name Flex Color Scheme as well. It already from the start came with a lot of predefined color schemes that you could select and try out and modify

just to make it easy to play with the different styles. So if you're an indie dev and you can decide yourself what you want and like and how you want the apps and the colors to look, it's easy to just select a few and experiment with different styles from the Flex Color Scheme. So I think...

So that's how it started. But a few versions after the first one, I started also providing a lot of convenience team data properties to actually make custom styles on component teams as well. So one of the first examples of that was, for example, the global border radius on all shapes via single property. So

So that is something that is quite tedious to do if you do it with just theme data. Say you want a border radius on all button types and shapes in your design. So with just one property with Flex Color Scheme, you can modify that. With vanilla theme data, you have to go and set that shape border property on every component there is. It's very tedious. Of course, this is actually what Flex Color Scheme does.

So today a more appropriate name for Flex Color Scheme would be Flex Team Data, which is more what it does. I do have a short sort of dense definition of explaining what Flex Color Scheme is, and that is that it is a

super fancy advanced team data convenience factory. So at the end of the day, it produces a regular fluttered team data object that, you know, of course gives your material app its default colors and styles all the material components using the component teams. You can do everything with vanilla team data that the FlexCore scheme does, but it would take anywhere from 1,000 to 3,000 lines of code to reproduce what it does.

So it takes a lot of the minutiae and tediousness out of it. And over the years, Flex color screen sort of

Evolved one of its examples into a companion app called the Teams Playground. And to many starting Flutter devs and also indie devs that don't want to deal with the mess of defining Flutter team data themselves, the Playground is the real kicker.

So in the beginning there was no, but it grew out of example number five to become what it is. So then, of course, we could ask, what is the team's playground? Well, that is what you see is what you get team configurator for the material app.

And what it does is that it outputs a Dart file with a team configuration matching what you made visually in the playground for the Flex ColorStream Team Data Factory API. And this thing you can just copy paste as a file into your app and the Dart file and use the team data it defines as the team for your

for your app and everything that you designed and defined in this playground. That's how your app and all the components will look like in your Flutter app, in Flutter Material app. So the playground itself is very interactive. So any teaming toggle, use change and modify, also changes the playground's

team itself I mean the app itself is teamed when you do and you toggle and experiment with teams in the playground so that the app itself applies this team to itself but it also contains a number of small mock-ups presenting the UI that you can show in different device mock frames so that you can see what it feels like also in a mobile app when you when you use this team

So that's also, it also interactively sort of generates this API configuration code for the team that you are designing and making. So you can put that code view on the side as well and see what the API is that it's generating when you toggle switches, et cetera, to understand a little bit what it does. But the key thing is, of course, that

Team data has very huge and complex API, and even FlexColor scheme would probably be a bit daunting to use without assistance of the Playground. But with the Playground, you don't have to know it. You just, you know, toggle and change things around, and when it looks the way you want it, you just copy the code and off you go. You have a team for your app.

I like to make the teams quite platform agnostic and you can also do things like we did, like make platform adaptive teams so that you can have one design for, say,

Android apps, if you want to have more like native looking Android feel, feel in Material 3 feel in your Android app, you can do that in the Playground. But have it adapt so that when you run the app on any other platform, that it looks more platform agnostic. You can make it

look more like an iOS, you know, Cupertino style, a little bit inspired by that. Or you could make it look inspired like ShardCN, which is very popular in the web community design. But of course, it will still be material, but most people probably won't even recognize it as material when you style it that way. So yeah, so it's quite an... Of course, one of the big boosts for the package was that it also...

a number of years ago became a Flutter favorite package. So that was quite a nice surprise to get that label for it. So that has been, of course, something that has gotten more known and recognized.

I've used it myself. I find it very helpful just to visualize things to get a better understanding. And I think like you come from CSS background, it's interesting how difficult some global changes are, whereas it sounds like you're trying to make that a bit simpler. Yeah, I hear that a lot. I don't have a strong background in CSS. I mean, I know basics of it, but I guess for those that are really coming from that background, that teaming flutter ups is very frustrating. Everybody that works with it tells me that. And so it's, of course,

nice that it you can have a tool that that helps them but it i think also think it helps a lot of indie devs that you know they want to get their app out they want to you know get it to look nice and they don't have the time to to spend on going in learning all the details in how to adjust everything in a material team to get it to look the way they want it to look so you can just experiment with the playground and tinker with it until you get it and i do have a number of

of built-in defaults there, sort of pre-made designs that you can click on and just quickly get some different styles from it. And of course, it comes with, I don't know, is it 60 different pre-built color schemes and you can make modifications of all of them or use any of them as a base for your own colors and just copy that and modify a few colors in it. If you find something that is close to what you like, you can use that as a base for your own color scheme as well.

So yeah, it's quite handy. I don't even attempt to team an application without it anymore. And at the end of the day, it just produces team data. And it does have limitations. But if you run into those, you can still take that as a base and do a few modifications using team data copy with and modify those parts that it won't do for you because it can't do everything that the team data API can.

The point with it is to do a lot of the things that are either very tedious to do and takes time and that people often want to modify. And then another useful package you've created is FlexSeedScheme. How does it compare to Flutter's built-in option? Yeah, that's a good point of the FlexSeedScheme. And that was actually born out of FlexColorSkeen.

So the flex seed scheme is actually what it sounds like. That only makes color scheme. And it is used to get around some limitations in the seed generated color scheme.

So in Flutter, you have this color scheme from seeds constructor to make a material three color schemes. The current color scheme in Flutter contains 46 colors. And with the dark team that makes, you know, 92 of them that you have to define colors to get a fully defined color scheme. And doing this by hand is very tedious. So when I was developing Flutter,

Flex color scheme, I also worked on algorithms to develop and take this seed-generated color scheme further. I was doing seed-generated color scheme for the color scheme before it existed in Material 3, but with other algorithms. Those algorithms are still present in Flex color scheme, but the seed-generation-based ones that came with Material 3

are extracted to their own package called FlexSeed Scheme. The biggest difference with this one compared to the vanilla one is that you have much more control over how you want the seed-generated color scheme to turn out. With the built-in color scheme from Seed, you can only seed-generate your color scheme from one single color scheme.

And the rest will be a little bit what, you know, the algorithm says that they should be. There used to be even one, only one variant of that, but now there are a few more variants. So you used to get only the pastels, etc. And there was no way to get around it. But now there is at least some objects that are a little bit more brighter, but they are still quite weird. So, but with the FlexSeed scheme, you have an API called SeedColorScheme from Seeds, where you can provide a separate seed color for

Each tonal palette used in the color scheme. So you can have a separate seed color for your primary, secondary, tertiary, aero, surface and surface variant palette generation. They can all use their own seed color. But it's not only that. You can also vary how

much of the chromacity from the seed color should be used when you generate the palette. So you can provide like min-max chroma, or you can tell it to actually use the chroma from the seed. And the

To make it even more advanced, if you want to, you can override the default color mappings from the produced tonal palettes. That means that which tone in the palette should be matched to what color scheme color when it does the mapping of these generated color schemes. So this might sound very complex, but it's actually pretty straightforward and easy.

It's possible to use the convenience of seed generation while still remaining in control of the algorithm and what it should look like at the end of the day. With the vanilla one, you don't have that freedom. The package still uses the Google's HCT hue chroma tone color space, which is a new color space that they actually invented for material 3D design.

And it also uses a slightly forked version of the material color utilities package that the Flutter SDK also depends on directly, the original one. But I had to fork it to be able to free it from some of its constraints. And another reason to fork it was also that Flutter pins the version of material color utilities that it uses, which made it difficult for me to

to sort of make a flex color scheme or the flex seed scheme package that you can use on all Flutter channels because Flutter often pinned different dependent versions of it in stable beta and master so that without dependency error rights you couldn't then depend on that package yourself, the MCU color utilities.

So that was my first reason for forking. It was just that because I couldn't just deal with the mess of the pin dependency from it all the time. But then I also ended up adding some features to it. And one of those features is that the Flutter color scheme from Seed comes with this scheme variants now as well. And I offer those as well, but it can offer those also with multiple seed colors. That's not something you can do with MCU plugins.

the native package of it. So yeah, but that ended up pretty nicely. And when you use Flex Color Scheme, you get all the benefits of Flex Seed Scheme built into Flex Color Scheme and the convenience of the playground. And you can use it there. You don't have to understand what you're doing. You can use just pre-made enums to select a few different things and just look at what it looks like. And there's a bunch of toggles that you can try to see and make the color scheme look like you want it to do.

But if you're making your own team data and you're doing all the teaming yourself and you have all the designers to do that, but you still need a color scheme and want to define that, then, of course, this is a package that only produces the seed-generated color scheme. You could always argue that maybe I can hand code this color scheme

And yes, you can, but you have to have a very deep understanding of all the color roles in this 46 color scheme and what their internal relations should be. Otherwise, you end up, you know, having shades and tones on colors that are wrong in the sense that they don't match what their design intent is.

If you want to go wild with the color scheme, you could. You could, I mean, map it any way you want, but then you have to also do a lot of remapping of all the component themes and use all the colors you put into the color schemes in a way that makes sense from your way. And doing that just ends up probably creating a big mess. So it's not something I recommend, but it's totally doable if somebody wants to do that.

But generally, I recommend seed generating the color scheme. And if you're not happy with the thing that the default algorithms produce, take a look at FlexSeed scheme and try its algorithms. And of course, always to get your actual brand colors, if you have those important ones with seed generated color schemes, you have to pin your main brand color. So typically, if you would pin your main brand color to the primary color, it

in the light scheme. That's usually, of course, the expected one. Maybe you have some secondary and tertiary colors. You can use them also. But in dark mode, most companies and brands don't have a correct sort of dark mode primary color.

Because the primary color usually needs to have a lot less saturation so that it doesn't clash too much with the dark color. The brand colors are typically designed to look good when you print them on white paper, not on black paper.

But you can still put that primary color into your dark scheme as well. You just have to put it on the primary container. It fits very well there. Typically, the same color that you have in your light team can fit on the primary container in dark team. And then you need a lighter shade for the primary. And you can just as well go with the seed generated version of it.

Then how you make those colors look nice, there's a lot of different ways with FlexSeed scheme to make it not so pastel dominated so that you still instead get, you know, bright and saturated colors or even some of them offer more like candy glow with colors and these kind of things. So there's a lot of things you can do with it and the

Another thing that people don't like or don't agree with material color schemes, the default is that it creates all these tinted surfaces and all these new surfaces as well. You know, we have the surface container, low, high, low west color.

bright, dim, high, highest and all this and they tend to get a little bit of a tint from the primary color that you are using to seed it and that's by design but with Flex Seed Scheme you don't have to do that you can make them the surface colors completely grayscale or you can tone down the tinting a lot

Typically in light color scheme, you don't want a lot of tint on your surface colors. In the dark mode, you can put a bit more of it in there and it will still look pretty cool. But in light mode, it tends to look bad pretty fast if you go high on the color tinting on the surfaces. And in my opinion, material three color scheme generations goes a little bit overboard in that.

But that's, you know, just a difference that we want. But I'd like to give people the freedom to design things the way they do and not lock them into a certain sort of, say, that this is what it is. And Material 3 still allows you to do all this, but you have to put in a bit more effort than probably most people are prepared to do. So that's where I ended up, why I ended up producing these tools, so that...

people can do it with less effort and not be restricted by the limitations in the built-in color scheme regeneration. So yeah, looking at sort of a little bit of the popularity, FlexSeed scheme does not have quite a lot of likes, but like FlexColor scheme has...

2,800 some likes on the on pump so it's a fairly popular package in that sense but flex seed scheme is much less known but when it makes an update in downloads so flex seed scheme still has over 300,000 downloads per month so clearly somebody's using it amazing and then you've also you're very busy a lot of packages last package I want to cover is you've also created the flex color picker how's it designed to be used

That was actually one of the first things that I wrote and published in Flutter by the effects color picker. I just needed a color picker that would enable me back then to pick all the built-in material to colors and also make custom palettes that I could pick colors from in apps for selecting themes and these kind of things. And I also added...

a sort of HSV color wheel in there where you can pick free colors, et cetera, and all that. And there were a lot of color pickers around for that, but I had another requirement for it too, and that was that I wanted to be able to quite flexibly decide what parts of all the elements it offers that you want to use in different use case scenarios. And another thing was that I wanted a good copy-paste experience from that color picker.

so that I can have a web color code, typically a hex RGB color code, or even the short one with just, you know, three letters that you can have on web two and just copy paste this into it. Not just so that you copy paste it into a field, but that you have there, but that it actually just copy paste it into the picker when it's focused. And it also manages to do that with the,

keyboard shortcut so that you can use ctrl c and ctrl v and ctrl and commands command c and command v on windows so those were some of the new things and that i was missing in a lot of the color pickers that i that i was trying out so i just made my own and it's gotten fairly popular as well it also has close to 300 000 downloads per month but

So it doesn't have all the different ways of manipulating colors in different color spaces. And that's where it's a bit lacking today. And probably I will come back to it and add that to it and might make it even more popular. But

Mostly I would probably add it because it's something I want to have also in a color picker. And maybe a pipette also to actually, you know, suck up colors from the app. Of course, you can't move that cursor outside of the Flutter window, so you would be really limited to that. So I don't know how useful it really is, but not easily anyway without doing some native course, you can do that.

But yeah, so it does have a unique feature and that is that it also generates a material tree tonal palette of the color that you pick and choose. So you can actually see what those palettes look like, but you can't really tune that palette yet. So that's another thing that I probably want to add to it as well.

But yeah, I do use it myself in most of the apps and tools that I write when I want to be able to pick and modify some colors. So it's used heavily, of course, in the Teams Playground and in a bunch of other things that I made. And I've seen it used in published applications as well. And that's always nice to see when you recognize, oh, somebody's using my picker. That's cool. Definitely. As a developer, that's the best thing, right? People actually use the things we build.

Yeah, and I've seen, I was in dropping in on some, you know, the YouTube stream, the Wednesday, the Wednesday's video stream or something like that in the chat there. And people see me there and they say, hey, we see I use your, I use your Flex Color Scheme package and things like that. We have like 50,000 downloads for this, for it. And it's used in that. And

So, and I know it's used in a lot of popular apps as well. And I do mention them in the docs, some of them at least, that I have sort of mentioned as use cases that mentioned that these apps have used Flex Color Scheme. And that's always nice to see that it comes to some fruitful use, the effort you put into it. Ultimately, I just created it because, you know, it was things I wanted to solve for, you know, and not do repeatedly myself. But, you know, why not share it? That's what it's about, at least for me.

Switching topics, something that comes up often in the Flutter community is state management. Do you have any particular thoughts yourselves on how you like to structure your apps? Every time in the hump, there are Wednesdays, podcasts, YouTube stream as well.

Yeah, personally, I started with Provider and I still think it's good enough for most use cases, even though it's supposedly not maintained and replaced by Riverboard, which I also used a lot. And I...

I used that at one stage. I used that pretty much for everything. But nowadays, I tend to go as light as possible. I mean, you can do a lot with just value notifier, change notifier, and value listenable builder and listenable builder. So these are, of course, really good tools to understand and know. I have also used...

inherited widget in the sense with all the individual property traits that you see on media query like you have this media query size of where you actually have each property as something that you can listen to context and those are quite handy to use if you are making a package and you don't want to you know depend on any third party sort of package for that in your package.

So, but they are very tedious to set up. So I wouldn't recommend them in an app as such as it's easy to make mistakes when you are setting that up for it and it's very tedious to do. But for a one-off thing inside a package where you need to provide this feature as something that feels very native-like to Flutter, it's a really nice tool to have. But...

One of my sort of fairly recent favorite for very complex reactive computed state is signals made by Roddy Davis and

You don't really need it for everything, but it's a nice tool to have in your belt when you have really complex computed reactive dependencies and want to use it for that. Sure, you can use it for everything also. And it's probably something that is also a welcome tool for people coming from the JavaScript, TypeScript world where signals are very common in many frameworks. So they might feel at home with that.

But if you want to keep it lightweight, I would say that a battle-tested contender would be ContextWatch. It's quite handy. So a little bit similar to what Provider does, but without the fuss with the whole tree.

Of course, when it comes to signals and context-wise, you still have to provide access to this somehow and get access to the data it provides. And you can do that with a service locator, if you like, with like GetIt or just Debold and slap them all into a static service class. A lot of big applications do just this. They don't care about that, you know, we slap this in a big, all our services in a big service class and they are just statics there.

So that's something I've seen done in codebases with more than 400,000 lines of code and their apps run just fine. So maybe not always overthink it. I am happy though that we have a good guidance now that maybe everybody doesn't agree with how it's written in the documentation about the architecture and this, but at least there is one now and that's at least good and you can learn something from that and

And that guide looks like it was inspired a lot by the Android architecture, the Android architecture guide that you have for developing Android apps.

So, yeah, but it's been an interesting ride sort of looking at all these debates. And I used to do, I don't know, Hillel, if you remember my state management package statistics post on Twitter. Sure, of course.

Yeah. So I used to do this top 30 packages, etc. I haven't updated it in a while, but I've been thinking, yeah, maybe I should do an update and see where we are now with all the packages. And I used to do that also for the

for the routing packages. So I should probably, you know, just do a refresh of that and see how it has evolved. It's probably been more than a year since I did any update on those to just, you know, check where we are. Would be interesting to see what they make. But I don't think the top, you know, most popular, they haven't really changed. They are pretty static. The top 10 in the state management in Flutter is, for external packages, is pretty much the same. You have block and

And I have nothing against blockers. I just think it's a little bit for, you know, smaller teams, maybe a little bit over-engineered and rigid. So maybe some people like that for Liverpool better for that reason. But on the other hand, for big teams, it provides a nice structure that everybody has to conform to. So, you know, there's always this up and down for that. And is there any advice to give someone just starting out?

So any advice for people starting out? Yeah, I would probably today say that try to learn it a little bit at least first without relying too much on AI. Although, you know, looking where we are going with the AI things now, I don't know if that kind of advice even makes any sense anymore in a year or so.

end of the year the prediction is that the best coders will be AI so I don't know if that will come true or not but still there will be people needed that understand our coding tools and are able to direct the AIs and help them and use them in meaningful ways so I do think it's still very useful to understand the framework at a deeper level so I would still start with a few courses to get started and like everybody else says just build stuff

I mean, when I was getting back into coding and learning and using Dart and Flutter to learn it, yeah, I watched a lot of courses, et cetera, just to do them and work through a number of them. And that helped, of course, to get over the initial hurdle. But at the end of the day, what helped was just building stuff. So that's really what you want to do if you want to get proficient in any framework. You need to build things with it.

It's good advice to start writing more code. And finally, is there anything else you'd like to promote? Oh, well, you know, I'm working today for HypeHype, which is a really cool gaming platform. And it's games made by the users of the platform and published within the platform.

So people might be familiar with Roblox. It's a little bit similar, but it's more mobile first. And we are also going to make it very AI first. So you will see a lot of cool AI things in it. But really, it's already very big. It has 350,000 lines of Flutter code as well. The user interface on top of these games that are published in the platform is written in Flutter.

which is really cool. And maybe even cooler technology-wise is that the game engine is our own game engine as well. And that one is also the tool that you use to write the games. You make them visual with the game ended or in the platform and publish the games in the platform. So there is an infinite feed of different games that users of the platform can play instantly.

We call it infinite feed like a TikTok or Instagram feed where you have photos and videos, but instead you just swipe up here and to the next game and you have another game to play. Of course, there is, you know, top games and which ones are most popular, etc. And you have a lot of other things like metagames in equipping your game character with things and...

And also chatting and talking to people and playing together in a multiplayer. You can record the games and view the replays of them. All these kind of really cool things and sharing that. So yeah, and as a game creator, when you make games with it, you can monetize that. And so we have a lot of people also already making a decent amount of money by publishing games on the platform, just like people do on Roblox as well.

Wow. That sounds really cool. I'll make sure to include links in the episode notes. So if you want to try it out yourself. Yeah. The,

it's not fully in the app store it's not available in every market yet but it's going to be soon but you can also use the web version of it and play the games on web and download the desktop build so we do support all platforms so there is a version for windows mac and and web but of course also published on the play store as mobile versions both on play and app store and also as a

as iPad versions. And in fact, iPad is very popular among creators that make games. They like to, you know, sit and make the games on an iPad. Interesting. Well, Mike, thank you so much again for the podcast. Really, let's get a chance to speak and hear more about your story. Yeah, it's a pleasure being here. And really, I do remember when

When we met, probably in 2019, I found that all this tweet and comment where we chatted and exchanged some word was probably on Twitter in 2019 about Invoice Ninja and some of the technologies that you used for making that. Long time ago. Time flies. Thanks. Thanks for having me on the podcast. Bye.