1 00:00:00,000 --> 00:00:19,129 *music* 2 00:00:19,129 --> 00:00:23,320 Herald: I would like to welcome our first speaker for the day and he's amazing. His 3 00:00:23,320 --> 00:00:28,359 talk which he's been working on all night. A warm welcome! 4 00:00:28,359 --> 00:00:32,410 *applause* 5 00:00:32,410 --> 00:00:38,190 Speaker: Yeah good morning. My name is 'the one with the braid' and today I will 6 00:00:38,190 --> 00:00:46,040 give an introduction into Flutter. What is Flutter? Flutter is a software development 7 00:00:46,040 --> 00:00:57,699 kit for creating cross-platform applications from one single codebase. 8 00:00:57,699 --> 00:01:03,329 Here you can see the great logo of Flutter. Brief history of Flutter: Flutter 9 00:01:03,329 --> 00:01:13,220 was announced by Google in 2015 as a new framework for creating Android 10 00:01:13,220 --> 00:01:26,709 applications. It was initially launched in 2018 and since that it has become one of 11 00:01:26,709 --> 00:01:39,010 the most popular cross-platform software development kits. Getting started with 12 00:01:39,010 --> 00:01:46,619 Flutter, well, we will have a look at the installation of Flutter, at one of the 13 00:01:46,619 --> 00:01:54,140 special features of Flutter called widgets. There we'll have a look on two 14 00:01:54,140 --> 00:02:00,470 different types of widgets called stateful and stateless widgets. And at the end we 15 00:02:00,470 --> 00:02:07,179 will have a look at something really strange in Flutter: Unlike in actually 16 00:02:07,179 --> 00:02:14,280 every other software you use for mobile development you write the design in your 17 00:02:14,280 --> 00:02:25,060 code but not in any XML files but directly into your Flutter code. Installation is 18 00:02:25,060 --> 00:02:34,189 quite easy on Linux and Mac OS. You can just clone the git repository from Github, 19 00:02:34,189 --> 00:02:41,450 update your PATH and enjoy your new Flutter installation. On Windows you need 20 00:02:41,450 --> 00:02:49,230 to download pre-built binaries as Windows is unable to execute shell scripts. That's 21 00:02:49,230 --> 00:02:57,670 it about the installation. Now we will go a bit deeper into the technology Flutter 22 00:02:57,670 --> 00:03:09,540 is using. Flutter is written as an extension for the language Dart, that's 23 00:03:09,540 --> 00:03:15,310 what you can see over there, it's a framework for the language Dart. And you 24 00:03:15,310 --> 00:03:21,209 can actually say the language Dart was developed for Flutter and Flutter was 25 00:03:21,209 --> 00:03:29,230 developed for Dart. Actually no one is using Dart without Flutter yet, so it was 26 00:03:29,230 --> 00:03:38,819 made just for Flutter. The language Dart is written in C++ and C and the so-called 27 00:03:38,819 --> 00:03:47,269 Flutter engine is written and C++ and C too. Why? It's simply because this allows 28 00:03:47,269 --> 00:03:55,099 low-level rendering, that means Flutter does not need any libraries of the 29 00:03:55,099 --> 00:04:01,090 operating system it's executed on. So if you run an Flutter application on Android 30 00:04:01,090 --> 00:04:06,310 you won't need any libraries of Android. If you run it on iOS you won't need any 31 00:04:06,310 --> 00:04:12,269 libraries of iOS and if you run it as a webpage you won't need any JavaScript 32 00:04:12,269 --> 00:04:24,930 dependencies. What does the engine provide us? The engine provides actually the basic 33 00:04:24,930 --> 00:04:34,330 rendering of the layout, core functions like I/O access, graphic encoding and 34 00:04:34,330 --> 00:04:43,710 decoding, animations, accessibility options and network of course. It's using 35 00:04:43,710 --> 00:04:55,300 the Skia library of Google, it's quite well known in Android and even for desktop 36 00:04:55,300 --> 00:05:03,440 development. That's what the engine does and on top of the engine you will have 37 00:05:03,440 --> 00:05:09,720 which is visible, and which is visible is called widgets. An application is built 38 00:05:09,720 --> 00:05:19,569 out of many widgets. You can just imagine widgets like HTML tags, you just put them 39 00:05:19,569 --> 00:05:26,069 into each other, they have several childs and so on and you get a tree of widgets as 40 00:05:26,069 --> 00:05:35,919 you get a DOM tree in JavaScript and HTML. That's how you can imagine of. Whoops, I 41 00:05:35,919 --> 00:05:43,940 hate these buttons. Let's have a closer look at these widgets. As already 42 00:05:43,940 --> 00:05:50,099 mentioned at the beginning we have two different kinds of widgets. We have these 43 00:05:50,099 --> 00:06:02,789 stateless widgets, they provide no feedback. For example a simple text or an 44 00:06:02,789 --> 00:06:11,259 image or buttons, a ListView, a table, they could be displayed as stateless 45 00:06:11,259 --> 00:06:19,040 widgets. A stateful widget is able to provide feedback means you can tell a 46 00:06:19,040 --> 00:06:27,199 stateful widget "if you press this button please do this". That's something 47 00:06:27,199 --> 00:06:33,750 you only can do with stateful widgets but not with a stateless widget. But why do 48 00:06:33,750 --> 00:06:38,220 you separate between these stateful and stateless widgets? Couldn't you just make 49 00:06:38,220 --> 00:06:48,150 one type of widget ? It's due to better performance because stateless widget is 50 00:06:48,150 --> 00:06:57,280 being rebuilt as soon as its content changes. For example we create a text 51 00:06:57,280 --> 00:07:05,449 containing the variable "hello_world" with the text "Hello world" and now if we 52 00:07:05,449 --> 00:07:13,220 change the variable "hello_world" the whole widget, this text will be 53 00:07:13,220 --> 00:07:24,509 rerendered on the screen. Every stateless widget will be just re-redenred without 54 00:07:24,509 --> 00:07:30,860 being able to be informed about a change of anything. And that's a difference to a 55 00:07:30,860 --> 00:07:38,990 stateful widget. A stateful widget is able to say "Okay, I now want to change because 56 00:07:38,990 --> 00:07:45,120 a timer was running down, because an event occurred because of I don't know what". 57 00:07:45,120 --> 00:07:56,400 And a stateful widget is not being rebuilt by its upper widget, by its super widget 58 00:07:56,400 --> 00:08:05,020 and so on. Means a stateful widget will not be changed if the state of the upper 59 00:08:05,020 --> 00:08:14,490 widget changes. That's the difference between this stateful and stateless stuff. 60 00:08:14,490 --> 00:08:23,340 I do not want to get deeper into the technology. Let's just have a look at some 61 00:08:23,340 --> 00:08:29,990 shortened source code. If you write an application for example a mobile 62 00:08:29,990 --> 00:08:38,200 application in Flutter it will actually be just this. Okay you will have to implement 63 00:08:38,200 --> 00:08:45,670 this homepage but that's actually all you need. You have the main method in which 64 00:08:45,670 --> 00:08:52,019 you call runApp() and there you provide an application, in this case a Material app. 65 00:08:52,019 --> 00:08:58,651 Material means it uses the Material design. Material design is a design 66 00:08:58,651 --> 00:09:05,320 standard by Google, you know it from Android but I could tell Cupertino app as 67 00:09:05,320 --> 00:09:12,760 well then it would show an iOS like user interface or I could just create my own 68 00:09:12,760 --> 00:09:21,730 style if I want but no one would like it. And there we provide just the homepage and 69 00:09:21,730 --> 00:09:31,380 now we'll have a look at the home page. Here you can see a basic class in Dart. 70 00:09:31,380 --> 00:09:38,010 Dart is the language for Flutter. You can see it is a stateless widget, means if the 71 00:09:38,010 --> 00:09:44,980 app opens it will be built, if the app closes, it will be moved to trash. If - I 72 00:09:44,980 --> 00:09:51,230 don't know what - if the system decides: okay better we say if I don't know what, 73 00:09:51,230 --> 00:09:56,720 we reduce network traffic, so the stateless widget cannot react, it will 74 00:09:56,720 --> 00:10:03,800 just get the information from the application and the operating system. 75 00:10:03,800 --> 00:10:15,660 Yeah. We here... the most important in any widget in Flutter is the build method the 76 00:10:15,660 --> 00:10:21,620 build-method contains everything which is displayed on the screen. In our case we 77 00:10:21,620 --> 00:10:30,860 will display a ListTile, means one element of an ListView containing some 78 00:10:30,860 --> 00:10:41,560 text and a button which will share any text if you press it. But that's not the 79 00:10:41,560 --> 00:10:47,960 interesting part. Important is this build method which tells okay this widget, my 80 00:10:47,960 --> 00:10:58,940 widget TestScoreDetail should look like this on the screen. Here again, this is 81 00:10:58,940 --> 00:11:04,990 everything which is finally displayed on the screen, everything which is within 82 00:11:04,990 --> 00:11:15,039 this build method. That was a stateless widget, a stateful widget is a bit more 83 00:11:15,039 --> 00:11:24,320 complicated. You can see over there, there's not written just 84 00:11:24,320 --> 00:11:31,300 JoinTestScoreTile, but JoinTestScoreTileState, means this is the 85 00:11:31,300 --> 00:11:39,139 class containing the state and the state offers different - you could sort, you 86 00:11:39,139 --> 00:11:47,620 could call them stages. First of all, the init state, in our case we do not modify 87 00:11:47,620 --> 00:11:51,990 anything, it does not need to be initialized, that's why we just call the 88 00:11:51,990 --> 00:11:59,839 super init state method but what you could do an init state for example who would be 89 00:11:59,839 --> 00:12:06,180 loading something from network, if my widget should display - I don't know - 90 00:12:06,180 --> 00:12:13,660 data from Wikidata and you would place the code for loading this data in the init 91 00:12:13,660 --> 00:12:25,149 state method. This is being executed before the widget is built the first time. 92 00:12:25,149 --> 00:12:34,620 Here you can see the build-method again and here I highlighted why we need a 93 00:12:34,620 --> 00:12:42,660 stateful widget in this case. You can see here, it's an if-statement, a short and 94 00:12:42,660 --> 00:12:51,290 inline if-statement. When you build the widget, it checks whether the variable 95 00:12:51,290 --> 00:12:58,839 testLoaded is true, testLoaded is initially false so the first time the 96 00:12:58,839 --> 00:13:04,019 widget will be opened, it will skip down there and it will show an progress 97 00:13:04,019 --> 00:13:11,570 indicator, means a spinning circle in the center. And as soon as this should ever 98 00:13:11,570 --> 00:13:21,240 change, it will as soon as this variable will get true, it will show this part and 99 00:13:21,240 --> 00:13:32,449 that's why we need a stateful widget, because the widget has to react on 100 00:13:32,449 --> 00:13:44,509 variables within the class. Over there, just at the beginning of the 101 00:13:44,509 --> 00:13:52,350 implementation of this class, you can see some variables initialized at the 102 00:13:52,350 --> 00:13:59,160 beginning. These are variables which are available within the class. It's just like 103 00:13:59,160 --> 00:14:14,029 you can see the use, it's the only use in this case over there. And again, as it's a 104 00:14:14,029 --> 00:14:21,130 widget, everything which is provided by the build, by the whole build method is 105 00:14:21,130 --> 00:14:27,390 what the widgets, what the widget looks like. So in the first case it will be this 106 00:14:27,390 --> 00:14:38,050 and afterwards it will be this. And now one more property of a stateful widget: Here 107 00:14:38,050 --> 00:14:47,860 we return an expansion tile, you can imagine like a part of a list which is 108 00:14:47,860 --> 00:14:52,649 expandable with an arrow button and if you press it will show some more detailed 109 00:14:52,649 --> 00:15:02,899 information and there we set a listener on the change of its expansion and as soon as 110 00:15:02,899 --> 00:15:11,139 it will be expanded, the first time, we will just execute this function loadScore 111 00:15:11,139 --> 00:15:20,590 and maybe the loadScore function would be the function changing this boolean to true 112 00:15:20,590 --> 00:15:26,399 and as soon as it will be changed to true we have our widget providing the 113 00:15:26,399 --> 00:15:36,910 information within there. That's the main difference to a stateful to a stateless 114 00:15:36,910 --> 00:15:48,389 widget. Now just a little compared to other cross-platform frameworks you maybe 115 00:15:48,389 --> 00:15:55,670 know. I will compare it with JavaScript frameworks like React and Electron. Okay, 116 00:15:55,670 --> 00:16:02,779 if you have a JavaScript mobile application, you usually load in webview, 117 00:16:02,779 --> 00:16:09,589 consuming about 200 megabytes RAM. This is ugly for a mobile device, because no 118 00:16:09,589 --> 00:16:14,470 mobile device wants to provide 200 megabyte RAM for five applications, 119 00:16:14,470 --> 00:16:23,199 because not every mobile device has that much RAM. That's how JavaScript works 120 00:16:23,199 --> 00:16:28,759 because you need a web viewer and webview needs all this stuff, webview needs a 121 00:16:28,759 --> 00:16:33,560 JavaScript engine, style engine and so on. That's different in Flutter, because 122 00:16:33,560 --> 00:16:40,149 Flutter code is being compiled to native code. Means if I compile this application 123 00:16:40,149 --> 00:16:47,141 for Android, the code will be compiled to Kotlin code which is then executed. Means 124 00:16:47,141 --> 00:16:56,589 no need for JavaScript, no need for virtual machines or anything like that. That's 125 00:16:56,589 --> 00:17:04,280 why the consumption of memory is much lower. The next point is its native look 126 00:17:04,280 --> 00:17:11,540 and feel. If you, for example, if you write an app in JavaScript you have the 127 00:17:11,540 --> 00:17:17,040 problem that its JavaScript and not the native design of the platform. If I write 128 00:17:17,040 --> 00:17:25,459 an Android app in Flutter, I can just tell the app: Ok, you should, you shall now 129 00:17:25,459 --> 00:17:29,679 look like an Android app, provide material design, provide buttons which look like 130 00:17:29,679 --> 00:17:35,600 Android buttons, provide a navigation drawer like an Android application and so 131 00:17:35,600 --> 00:17:42,000 on. That's actually almost impossible with JavaScript but in flutter it's actually 132 00:17:42,000 --> 00:17:50,350 the standard. Then this, there I will come to one of the problems of Flutter: It's 133 00:17:50,350 --> 00:17:57,730 the same layout on all platforms. Means if I tell my application: Okay, you shall 134 00:17:57,730 --> 00:18:02,790 look like an Android application, it will even look like an Android application if I 135 00:18:02,790 --> 00:18:10,250 compile it for a Linux desktop or for iOS. Means you as developer have to decide 136 00:18:10,250 --> 00:18:16,250 which layout will be used and this layout will be used or this design will be used 137 00:18:16,250 --> 00:18:24,730 on every platform you deploy the app to. Of course, you can use some styling stuff 138 00:18:24,730 --> 00:18:33,179 within the app to make it more like a native designed platform application for 139 00:18:33,179 --> 00:18:39,070 your platform and no loss of performance is what I just explained at the beginning 140 00:18:39,070 --> 00:18:49,540 as native app. I hope I could, I was able to introduce some bit of the idea of 141 00:18:49,540 --> 00:18:57,490 Flutter, I would just now start like to start an Q&A about Flutter, about what it 142 00:18:57,490 --> 00:19:05,890 is able, what you can do with Flutter and what you cannot do with Flutter. Thank you 143 00:19:05,890 --> 00:19:08,130 for your attention. 144 00:19:08,130 --> 00:19:18,489 *applause* 145 00:19:18,489 --> 00:19:24,970 I don't know, shall I moderate? I would just ... oh, ok well then you can just 146 00:19:24,970 --> 00:19:28,440 ask. Q: You said that is compiled to native 147 00:19:28,440 --> 00:19:35,070 code and then afterwards we need a different tool change for each OS. 148 00:19:35,070 --> 00:19:40,350 Do we have some experience, what is the effort, what do we have to do to, let's say 149 00:19:40,350 --> 00:19:43,590 run it in *incomprehensible* 150 00:19:43,590 --> 00:19:48,350 A: Well, you actually, the question was whether, 151 00:19:48,350 --> 00:19:54,250 what you have to do for running or for providing one app at four different 152 00:19:54,250 --> 00:19:58,030 platforms. Well, everything you have to do is running Flutter build and name of the 153 00:19:58,030 --> 00:20:04,941 platform. So if you decide to deploy it to iOS, Android, Linux and Mac OS you can 154 00:20:04,941 --> 00:20:15,150 just execute "flutter build apk" for Android, afterwards "flutter build ios" 155 00:20:15,150 --> 00:20:22,021 for iOS, "flutter build linux" for Linux and "flutter build macos" for Mac OS. So 156 00:20:22,021 --> 00:20:29,840 you actually do not have to go deeper into the single platforms. Flutter provides 157 00:20:29,840 --> 00:20:39,210 everything you need there. Did I answer your question? 158 00:20:39,210 --> 00:20:48,679 Q: *(incomprehensible)* A: Yeah, it will install it automatically, 159 00:20:48,679 --> 00:20:54,120 if you download it, if you download Flutter and you execute it the first time, 160 00:20:54,120 --> 00:20:59,929 it will ask you to install this and this and this, the Android tool chain, the iOS 161 00:20:59,929 --> 00:21:16,840 Xcode tool chain and whatever you need to. Q: I have a question. At the main function 162 00:21:16,840 --> 00:21:23,610 you just have to define your style and the home page right. So what is hindering me 163 00:21:23,610 --> 00:21:29,460 to say: Release a version for Android to the Android style then just change the 164 00:21:29,460 --> 00:21:33,440 style for something that looks more iOS and then release a different version for 165 00:21:33,440 --> 00:21:37,270 iOS? A: Yes, sure you can do it and Flutter 166 00:21:37,270 --> 00:21:47,440 even offers a parameter of material app, you can provide their theme data class and 167 00:21:47,440 --> 00:21:54,910 within this theme data class you could tell the application: OK, on iOS I should 168 00:21:54,910 --> 00:21:59,120 behave and look like this and on Android I should behave and look like 169 00:21:59,120 --> 00:22:03,620 this. So even offers native functionalities for this. 170 00:22:03,620 --> 00:22:12,159 Q: Thank you for this nice talk. Who has developed Flutter and how it is protected 171 00:22:12,159 --> 00:22:20,240 by being bought by Oracle. A: I don't think Oracle will buy Flutter, 172 00:22:20,240 --> 00:22:27,120 because it's developed by Google and I'm quite sure Google won't sell it. And as 173 00:22:27,120 --> 00:22:33,750 its open-source, it will remain open source. I'm not sure about license, it was 174 00:22:33,750 --> 00:22:47,150 I guess it was Apache or MIT license. So it won't become closed-source software 175 00:22:47,150 --> 00:22:52,331 tomorrow. Q: Hi and thanks again for the talk. What 176 00:22:52,331 --> 00:22:57,370 I would actually know, is the performance of all native components, I mean like all 177 00:22:57,370 --> 00:23:08,800 native code the same on all platforms? A: Yes-No because some functions are not 178 00:23:08,800 --> 00:23:14,890 available on every platform. For example, if I run the application on the web, you 179 00:23:14,890 --> 00:23:20,919 won't be able to save local files or open local files, because that's not what a 180 00:23:20,919 --> 00:23:28,220 website should do or just can do. But yeah, on the mobile platforms actually 181 00:23:28,220 --> 00:23:31,220 everything is the same, on the desktop platforms everything is the same and in 182 00:23:31,220 --> 00:23:38,100 the web, it's a bit different. Q: Hi thanks for the talk. What about 183 00:23:38,100 --> 00:23:43,730 capabilities like Bluetooth Low Energy. Is there any restrictions or something like 184 00:23:43,730 --> 00:23:51,340 that to get deep into the platform? A: Well, Flutter provides access to 185 00:23:51,340 --> 00:23:57,549 Bluetooth. The only restrictions you may have is from your platform, but even if 186 00:23:57,549 --> 00:24:04,419 you want to use a feature which is not implemented in Flutter, you can access 187 00:24:04,419 --> 00:24:09,720 native code. So from flutter you can just call Swift code on iOS and Kotlin code for 188 00:24:09,720 --> 00:24:15,460 Android and so on, if anything is not implemented in Flutter. 189 00:24:15,460 --> 00:24:20,710 Q: Hey I was a little bit late, in the talk you maybe already talked about this, 190 00:24:20,710 --> 00:24:25,840 but what kind of projects did you make with Flutter and did you think that 191 00:24:25,840 --> 00:24:29,020 Flutter was a good fit for these projects or not? 192 00:24:29,020 --> 00:24:35,049 A: Well what I do with flutter is actually everything running on mobile devices, 193 00:24:35,049 --> 00:24:42,289 because I'm not such a huge fan of the native programming languages of iOS and 194 00:24:42,289 --> 00:24:49,850 Android. I don't like Java and I don't like Swift, that's why I got used to 195 00:24:49,850 --> 00:24:57,860 Flutter. And yeah, I think it's actually very good for this, because you only write 196 00:24:57,860 --> 00:25:05,210 code once and then you can deploy to all the mobile platforms. Applications I 197 00:25:05,210 --> 00:25:13,350 developed were mostly JugendHackt projects, projects of youth hackathons, of 198 00:25:13,350 --> 00:25:22,270 the open knowledge foundations. Other questions? 199 00:25:25,870 --> 00:25:31,590 Q: Hello. All the widgets are emulated and not native widgets of the operating 200 00:25:31,590 --> 00:25:41,970 system, of iOS or Android? A: It's not emulated nor if you use the 201 00:25:41,970 --> 00:25:48,690 native design, it's the native design. Flutter provides its totally own graphics 202 00:25:48,690 --> 00:25:54,669 library, so even if you use Cupertino design on iOS, it's not the Cupertino 203 00:25:54,669 --> 00:26:00,630 design from iOS but the Cupertino designed from Flutter. So independent of the 204 00:26:00,630 --> 00:26:04,350 platform, it offers its own graphics library. 205 00:26:04,350 --> 00:26:09,650 Q: So you lose the integration with accessibility features from the operating 206 00:26:09,650 --> 00:26:14,880 system? A: No that's what I told on this slide: 207 00:26:14,880 --> 00:26:22,070 The engine, the low-level engine provides a accessibility component, for example, 208 00:26:22,070 --> 00:26:26,859 and, yeah, pipes them to the native platform. 209 00:26:29,519 --> 00:26:35,549 Q: So what's the main advantage compared to other frameworks like Qt? 210 00:26:35,549 --> 00:26:43,340 A: Better performance, I would just say and many more platforms, because most of 211 00:26:43,340 --> 00:26:48,630 the frameworks are just - they are usually just available for mobile platforms. 212 00:26:48,630 --> 00:26:53,870 Electron focus on, for example, for desktop platforms and flutter provides 213 00:26:53,870 --> 00:27:00,070 them all and just from one single codebase and its native code you execute. 214 00:27:00,070 --> 00:27:05,640 Q: Have you ever worked with background services, native background services on a 215 00:27:05,640 --> 00:27:10,669 platform? Like Android service? A: Yeah, Flutter provides background 216 00:27:10,669 --> 00:27:17,929 services and if you use them, it will just subscribe the native background services 217 00:27:17,929 --> 00:27:20,939 of the platform you're using. 218 00:27:29,534 --> 00:27:31,409 Q: What's the current state of IDE 219 00:27:31,409 --> 00:27:37,140 integration because with other frameworks I had problems that the IDEs I use are 220 00:27:37,140 --> 00:27:44,269 mostly the ones from JetBrains and those didn't work with all frameworks I tried. 221 00:27:44,269 --> 00:27:52,590 A: Flutter offers official support to Android Studio and Visual Studio Code, but 222 00:27:52,590 --> 00:28:00,770 for many other IDEs there are third-party plug-ins with language support for Dart 223 00:28:00,770 --> 00:28:15,610 and Flutter. Q: Are there any restrictions on how far 224 00:28:15,610 --> 00:28:27,490 you can make your app ready for, for example provisioning profiles on iOS to 225 00:28:27,490 --> 00:28:36,640 get ready to in the store or is it just raw building for that platform and 226 00:28:36,640 --> 00:28:42,870 everything else if you want to get it in the store or you have to go native? 227 00:28:42,870 --> 00:28:54,549 A: No, I never had a problem with that. I published three apps for iOS. iOS has most 228 00:28:54,549 --> 00:28:59,559 restrictions and I never had any problem, because the design of flutter follows all 229 00:28:59,559 --> 00:29:05,740 the guidelines and they pay attention on following the guidelines of the maintainer 230 00:29:05,740 --> 00:29:10,448 of the stores of all the platforms they support. 231 00:29:13,679 --> 00:29:21,950 Q: The person there asked about IDE. I understood IE and that's a good point - 232 00:29:21,950 --> 00:29:29,919 web platform: How the Microsoft browsers are supported as they are used heavily in 233 00:29:29,919 --> 00:29:34,990 big environments. A: Sorry what was, what should I say? 234 00:29:34,990 --> 00:29:40,950 Q: My question is how Flutter supports the Microsoft browsers, even if we don't want 235 00:29:40,950 --> 00:29:47,000 use them all but we need do somehow. A: According to the README of Flutter Web 236 00:29:47,000 --> 00:29:54,350 repository, there's no support for browsers by Microsoft and I even tried 237 00:29:54,350 --> 00:30:00,950 once, you will see an empty screen in Internet Explorer and on Microsoft Edge 238 00:30:00,950 --> 00:30:07,130 you will get many crashes. But this will change in January as Microsoft will start 239 00:30:07,130 --> 00:30:13,700 rolling out the chromium based Microsoft edge to all Windows 10 devices and even 240 00:30:13,700 --> 00:30:21,340 older Windows devices. So that's something, I say I don't care about . 241 00:30:21,340 --> 00:30:23,850 *Music* 242 00:30:23,850 --> 00:30:49,000 Subtitles created by c3subtitles.de in the year 2021. Join, and help us!