 Gut, also, ich habe jetzt das Zeichen bekommen, dass es langsam losgehen kann, es kommen noch ein paar rein. Ja, ich warte noch eine Sekunde, bis alle sich dann hier geordnet haben, derweil kann ich mich ja schon mal bedanken für die Superorganisation, also ich finde es ist ja hier so faszinierend, dass das alles so toll klappt und ja, begrüße natürlich jetzt hier alle nochmal zu dem Vortrag und auch zur GPN nochmal und ja, ich stelle mich auch kurz vor, also mein Name ist Dieter Meiler, ich bin von der UTH Anberg-Weiden, die kennt wahrscheinlich auch keiner, wobei man weiß es nicht genau, also es ist so, das ist eine Hochschule in Bayern, Ostbayern, Oberpfalz, ich weiß nicht, den ersten, den ich hier getroffen habe, der war genau aus Anberg und ich habe jetzt auch schon ein paar andere Oberpfälzer hier gesehen, also das heißt vielleicht ist doch nicht so unbekannt, aber es ist halt eine Fachhochschule kann man sagen und da gibt es eben auch Informatik als Studium, nämlich Medieninformatik und Industrie für Nullinformatik und auch Medientechnik, deswegen passt es auch schön hier an ZKM finde ich und es ist so, dass ich da eine Lehrveranstaltung gemacht habe, jetzt einmal aushilfsweise letztes Semester, letztes Wintersemester, also schon fast wieder ein Jahr her und da ging es eben um App-Programmierung und dann sollte ich eben diese Veranstaltung übernehmen und dann war es auch so, dass zu der Zeit irgendwie eine Meldung kam über Heise oder so, dass jetzt irgendwie Google ein neues Betriebssystem rausbringt und die dann irgendwie Android einstampfen wollen und das dann alles ganz neu wird und so und dann habe ich mir gedacht, wenn ich jetzt den Studierenden dann irgendwie halt das alte, den alten Zopf beibringt, so ungefähr, das geht ja gar nicht, da muss man vielleicht mal schauen, dass man was Neues eben, die neue Technik eben mal sich anschaut und dann vermittelt und dann bin ich in das Thema, Entschuldigung, eben so reingekommen, eben, dass man jetzt die Apps programmiert eben mit Flutter, das ist so ein neues Framework und im Wesentlichen geht es jetzt in dem Talk eben um dieses neue Framework und das neue Framework wird programmiert mit einer nicht ganz so neuen Programmierspray, die heißt eben Dart und damit will ich einsteigen, weil eben wie gesagt eben Flutter mit Dart programmiert wird und ja, also im Wesentlichen so sieht man mal, dann möchte ich noch was kurz erzählen über auch die Layouts und das Design und so und am Schluss noch ein bisschen mehr so ein Beispiel bringen, ein größeres vielleicht mal, dass man mal sieht, dass man da auch wirklich was programmieren kann damit. Jetzt muss mal eine Frage ins Publikum, wer hat denn schon mal was mit Flutter gemacht, das ist mal Interesse halber, sind ein paar, ja also sehr wenig jetzt würde ich mal sagen, also wer hat sich schon mal Dart angesehen, okay ungefähr die gleichen, ja genau weil das ist auch an sich glaube ich sehr sinnfreies, sich Dart für was anders anzusehen. Ich gehe jetzt einfach mal ein bisschen weiter, also Dart ist eben eine Programmierspray, die gibt schon eine Zeit lang auch von Google entwickelt, so mit Go zusammen, ja die ist so ähnlich finde ich jetzt wie Java, C Sharp, C++, gibt es jetzt in der Version 2 mittlerweile, ja, kompiliert auch irgendwie zu nativen Armcode wohl auf dem Handy und das Ganze eben Head of Time, das heißt das Ganze soll auch sehr schnell sein und das kann ich auch bestätigen. Hier sieht man mal so eine Hello World Main Funktion, die unterscheidet sich jetzt eigentlich kaum zu anderen Programmiersprachen, die kann man dann starten mit dem Dart Kommando über die Kommando Zeile, also ich kann es auch mal kurz zeigen, dass es da wirklich funktioniert, mal schauen, also hier einfach Hallo ausgeben, funktioniert natürlich hier klar, also kein Thema, das Ganze muss man eben nicht erst kompilieren und dann starten, das funktioniert halt im Wesentlichen auch so ähnlich, wie man es halt so auch von gewissen Sprachen erkennt, also das Problem ist man weiß es nicht, ist es jetzt irgendwie so eine dynamische Sprache wie Python oder ist es jetzt so eine Sprache wie C++ oder so, da gehe ich gleich mal kurz darauf ein auch, also ich habe jetzt einmal, das ist ganz interessant finde ich, diese Typen, die es da gibt, möchte ich mal durchgehen, also man muss auch dazu sagen, dass da eben eine typisierte Sprache ist, aber auch dynamisch, also das ist irgendwie erst einmal ein Widerspruch in sich natürlich, aber man kann tatsächlich beides machen, also es gibt dieses Keyword, wie hier war, dann wird einfach der Typ im Prinzip durch Typen-Inferenz rausgefunden vom System, aber der Typ ist dann trotzdem quasi fest, also ähnlich gibt es ja auch in anderen Sprachen mittlerweile. Ich gehe mal, ich habe ja nicht so viel Zeit, ich muss mal schauen, dass ich da in der Zeit bleibe. Es gibt zwei Zahlen Typen, es gibt int und double lustigerweise, also int ist im Prinzip der Typ für die ganzen Zahlen, es gibt auch nicht sowas wie long oder so oder short oder so und es gibt dann noch double als eben Typ für reelle Zahlen und nicht sowas wie float, das ist irgendwie seltsam. Das ist so, also wie gesagt, es steht hier für ganze Zahlen und für reelle Zahlen, jetzt denken sich ja also ein bisschen wenig, aber das ist so, dass eben das System wohl rausfindet, wie groß mein Platzbedarf ist im Speicher und dann eben genau den entsprechenden Platz reserviert für eben long oder für int oder so und auch für jetzt zum Beispiel bei double, könnte es auch sein, dass es eine float wird, wenn ich jetzt nicht mehr Speicherplatz verbrauche, also das heißt, das wird dann dynamisch rausgefunden. Ich persönlich hätte es vielleicht lieber float genannt, weil es irgendwie halt passender wäre für Flieskummerzahlen, aber wahrscheinlich ist es so, dass das eben die Obergrenze ist für die Größe der Zahl, dass das eben entspricht vielleicht so ein double Typ in Java oder so. Es gibt dann eben natürlich so ein Wahrheitstyp wie bool, der kann natürlich true or false sein, was man erst vor kurzem so dann richtig aufgefallen ist, ist auch, dass wenn man die nur deklariert, dass wenn ich jetzt irgendwie eine Bullshevariable deklariere, dann hat die erst mal den Wert null, das heißt alle Variablen, die ich deklariere, kriegen erst einmal diesen null Wert, das heißt eigentlich kann diese Bullshevariable auch irgendwie drei Werte haben, also null, true und false und das null ist aber auch nicht false sein, da muss man aufpassen. Also wenn man da quasi einen Vergleich macht und auf false prüft, dann ist das nicht eben gleicher und deswegen muss man da ein bisschen aufpassen. Es gibt und ich dann einen Stringtyp. Das Ganze ist auch finde ich ein bisschen so gemacht worden von Google, denke ich, dass ich da auch Java programmiere, die eben mit Android programmiert haben, sehr wohlfühlen, also das String wird dann auch großgeschrieben. Es gibt dann Multi-Line Strings eben mit drei Hochkomma und dann kann man da mehrere bilden. Es gibt dann auch so ein Typ Symbol, da kann man einfach irgendwelche Labels mit so einem Hash vorne dran eben speichern, um jetzt irgendwelche, was es sich, Sachen zu labeln eben. Es gibt aber auch Enams, also ich erzähle jetzt auch nicht alles, ich gehe jetzt bloß mal kurz über ein paar wichtige Sachen durch, also Enam gibt es auch, aber es gibt natürlich auch so was wie Symbol. Es gibt dann einen Typ Function und man kann natürlich Funktionen drin speichern in so einer Variable. Da gibt es auch eine schöne Kurzschreibweise, so Lambda-Schreibweise, natürlich wie wir es jetzt mittlerweile auch kennen für in vielen Programmiersprachen, also dann eben die Parameter in Klammern und dann den Pfeil und dann eben einen Ausdruck. Und der Fat Arrow, der nennt sich irgendwie Fart, habe ich jetzt auch gelernt, der Douglas Crockford hat das so genannt irgendwie, also für Fat Arrow irgendwas. Wenn man mehrere Sign Code jetzt in so einer Lambda Funktion hat, dann kann man den Pfeil weglassen und schreibt eben hier nur in Klammern die Parameter und dann eben die einzelnen Kommandos mit Return dann allerdings. Hier wird er dann der letzte, also der Ausdruck direkt evaluiert und zurückgegeben. Man kann auch interessanterweise immer irgendwie die Typen auch weglassen, das heißt dann wird das irgendwo dynamisch gebildet oder halt irgendwie auch durch Typ-Inferenz gebildet. Das Schöne ist, also das finde ich auch was da, was mir auffällt beim Programmieren ist, dass man natürlich jetzt, wenn man eine schöne Entwicklungsumgebung hat und nicht einfach nur ein Editor, dann hat man auch eine ganz tolle Autovervollständigung, kann ich gleich zeigen und kriegt dann also wirklich tolle Tipps, wie das Ganze eben zu programmieren ist, also was fehlt oder so, irgendwelche, was das ich, Implementierungen und so weiter, die man dann eben angeboten kriegt. Das habe ich natürlich nicht bei so Sprachen, die so dynamisch sind wie bei Javascript oder so und deswegen finde ich es, das eigentlich eine sehr angenehme Art zu arbeiten mit dem Ganzen, muss man auch dazu sagen, also das Start von ganz früher, wie es eben von Google gemacht worden ist in der Version 1, war ja eher so eine Art Ersatz für Javascript irgendwie im Browser, das war dann im Google Chrome Lift das eben und deswegen hat es sich eigentlich, hat es auch einen schlechten Ruf bekommen, weil es eben so eine Art Konkurrenz von Google für Javascript sein sollte, aber ich muss sagen also so in dieser Version, wenn man es jetzt hier so sieht, ist es eben definitiv ganz was anders als jetzt Javascript, es ist schon mehr so in der Richtung, in der Liga C-Sharp und Java, würde ich sagen, also da ist das Ganze angesiedelt und es ist auch nicht mehr dazu da jetzt, um nur im Browser zu laufen, sondern es gibt Reserve Implementierung, es gibt eben diese Plattform unabhängige Flatterprogrammierung, ich gehe das deswegen bloß durch, weil man zum Teil den Code gar nicht direkt versteht und weil halt ein paar Sachen aufgefallen sind, die auch in Flatter immer wieder dran kommen, also das sind die wichtigsten Sachen, die man wissen muss, um jetzt mit Flatter auch zu programmieren, weil das immer wieder dran kommen, also Lambda es kommen dran, es kommen verschiedene andere Sachen dran, zum Beispiel eben Listen, man kann jetzt eben hier so eine dynamische, also Listen sind immer dynamische Areas in dem Fall, wenn die so eckige Klammern außen rum haben, da kann ich natürlich, wenn ich jetzt keinen Typ angebe, auch wirklich verschiedene Sachen speichern und kann dann aber auch eine Liste vom Typ Double machen, also das heißt, das ist der Typ mit so einer Generics Notation eben und es gibt es auch, also es gibt auch, das habe ich aber nicht auf den Folien drauf, so was wie eben Typparameter gibt es auch, also Generics und da kann ich natürlich sagen, ich hätte jetzt gerne nur eine Liste, wo nur eben, muss man sich kommen, zahlen, reinkommen oder reali zahlen, das kann ich machen, es gibt da noch einen Typ Map, der ist eben so ein Key Value Typ, wie man es eben auch bei von Jason kennt, dass ich sage, ich habe eben einen Index, also einen String als eben Key und als Value eben dann irgendwas anders und das kann man auch machen und das ganze ist dann vom Typ Map, man kann das dann auch natürlich irgendwo so ähnlich verschachten wie jetzt mit einem Jason Struktur auch natürlich, man kann dann auch zum Beispiel hier auch eine Funktion mit reilen Bauern, also ist schon noch so dieses JavaScript-Erbe, das sieht man dann schon noch irgendwie wieder aus dem Ganzen, das ist da schon noch irgendwo drin natürlich. Ja, genau, was auch noch interessant ist, das habe ich dann oder drunter gemacht, es gibt TypeDef als Keyword und da kann ich zum Beispiel, weil hier bei diesen Funktionen habe ich ja das Problem, ich weiß jetzt gar nicht, was die Funktion für eine Signatur hat, ich bin zu schnell, also da kann ich die Signatur der Funktion angehen mit dem TypeDef, dann sage ich eben, My Function, das ist jetzt der neue Typ und der hat diese Signatur, Rückgabe wird int und einen int als Eingangsparameter und dann kann ich sagen, My Function fu gleich int x, return x mal x, dann habe ich im Prinzip so eine eigene Funktion definiert, muss man auch wissen, weil manche Sachen in Flatter eben diese Dinge auch nutzen. Genau, und jetzt um noch mal reinzukommen, also es ist natürlich so, dass das Ganze irgendwo so ähnlich funktioniert, also die wollen das, ich denke mal irgendwann wird das wirklich so weit sein, dann werden die, denke ich mal, Java durch Dat ersetzen, also das prognostiziere ich schon, dass das demnächst kommt, die sagen ja auch mittlerweile, dass man eben damit entwickeln soll, auch mit dem Flatter, jetzt auch für App Programmierung, für Android wohl und wenn man das so sieht, dann sieht das natürlich sehr aus wie Java, also das habe ich jetzt einmal bewusst so gemacht, dass man mal ein Beispiel nimmt, das eben genauso in Java auch funktionieren würde, also das heißt, da brauche ich auch nicht mehr dazu erklären, denke ich, ich denke mal die meisten wissen ungefähr Java Programmierung, mal Handtuch, wer kennt sich einigermaßen aus, ja, dann habe ich mir gedacht, also alle und also das kann jeder lesen, das sage ich jetzt auch nichts mehr dazu, man kann dann eben das Ganze verwenden, ich sage Person, P, gleich New Person und so weiter, genau, also das heißt in zwei Dateien, man kann das aber jetzt auch in Dat und das gefällt mir eigentlich ganz gut sehr verkürzen, also fangen wir mal vielleicht mit dem Konstruktor an, da kann man nämlich Folgendes machen, dass man zum Beispiel diese Wisspunktname, gleich Name gar nicht mehr machen muss, diese Zuweisung, sondern man kann das quasi in einer Zeile machen, ich sage einfach Person, Wisspunkt, Vorname, das ist dann gleich die Zuweisung zu der eben Objektvariablen und dann habe ich das dann gleich drin, da mache ich da hinten ein Strichpunkt und dann ist es schon fertig, also das heißt, ich habe das in einer Zeile, was hier noch auffällt ist, ich habe keine, also es gibt es auch wirklich nicht, es gibt kein Public, Private und Protected, es gibt nur den Unterstrich und der bedeutet eben geschützt, das heißt, das ist sowas wie Package Local in Java, mehr gibt es nicht, es gibt eben nur Public und Package Local kann man sagen, es gibt aber noch Getter und Setter, das gibt es auch noch, da kann wir auch noch ein bisschen was machen. Ja, also die haben jetzt sich gedacht, die nehmen nur das Notwendigste da mit rein, was eben eben nötig ist, der Unterstrich, der ist so ein bisschen wie man es jetzt so kennt bei Python vielleicht, bloß da hat es eben keine Auswirkungen, also das heißt, da kann ich ja trotzdem darauf zugreifen, also das ist jetzt nicht nur eine Konvention, sondern das ist auch wirklich jetzt dazu da, um das zu schützen sozusagen, wenn ich von einem externen Paket kann ich das dann nicht sehen, das ganze, genau. Es gibt auch so, kann man auch alles nachlesen, habe ich auch noch irgendwie Quellen noch mit dabei, irgendwelche Coding Styles, also Coding Conventions und so weiter, die sind teilweise ein bisschen anders, als man es kennt. Jetzt vielleicht noch diese String-Auswertung, die kann ich auch noch mal kurz erwähnen, das heißt Variablen in Strings kennt man auch aus anderen Sprachen, werden mit Dollar-Zeichen eingeleitet, das ist vielleicht ein bisschen von PAP inspiriert und da werden dann quasi die Variablen direkt evaluiert, ich kann auch ganze Ausdrücke machen, in die mich da noch geschweifte Klammern außenrum macht und kann dann quasi die Strings direkt eben hinschreiben, was natürlich sehr angenehm ist. Was hier noch auffällt da unten, ich muss dieses New Keyword nicht nehmen, das heißt, wenn ich einfach nur Person mache, dann ist das das gleiche wie New Person, das am Anfang vielleicht ein bisschen ungewohn für Java Programmierer, aber eigentlich braucht man es ja wirklich nicht, das heißt, da wird ein Objekt erzeugt, also es keine Aufruf, kein Statisch, sondern wird der Objekt erzeugt, in der Variable P gespeichert und wenn ich das als hier wahrschraubt, dann ist das trotzdem quasi statisch typisiert, weil ich kann das dann immer ändern, ich kann in dieses P dann keine andere, kein anderes Objekt mehr speichern, außer Persons eben im Fall. Gut, es gibt da noch bei dem Konstruktor noch ein paar andere Sachen, zum Beispiel ich kann optionale Parameter hinzunehmen, indem ich die mit eckigen Klammern einschachtel und denen dann Standardwerte gebe, das heißt, die haben Standardwerte und die werden eben dann wenigstens nicht verwenden, die Parameter automatisch verwendet, das heißt, ich spare mal das, was ich bei Java habe, dass ich mehrere Konstrukturen schreiben muss. Ich habe nur einen Konstruktor, schreibt da alles rein und dann war es das eigentlich, macht das Ganze natürlich viel angenehmer irgendwo. Und wie gesagt, der Zugriffsschutz, der kann man hier auch noch ein bisschen mit Gettern zum Beispiel machen, dass ich sage, ich kann jetzt überhaupt in diese Variable Info gar nicht schreiben, sondern ich kriege nur einfach zum Beispiel diesen String raus und ja, das ist halt dann eben auch mit dieser Lander-Syntax noch verknüpft, ich sage GetInfo, Pfeil und dann eben was rauskommt. Und da unten eben die Aufrufe, dann kann man sich noch mal genauer anschauen, das abtippen, das spare ich mir jetzt, weil sonst komme ich da hier nicht durch. Okay, was gibt es noch? Es gibt sogenannte Immutable-Classen, das heißt, die sind einmal, die Objekte sind unveränderlich im Prinzip. Dazu muss ich konst vor den Konstruktor stellen und die ganzen Objektvariablen, die werden dann eben final und dann wird es einmal zugewiesen und dann ist es quasi ein Immutable-Objekt, das sich nicht mehr verändern kann. Das ist ganz interessant, weil eben viele Sachen dann in Flutter auch so funktionieren, dass die eben entweder Immutable sind oder nicht. Was hier noch dazu kommt unten, das sieht man schon, da gibt es noch was anderes. Es gibt so Konfigurations-Dateien, die nennen sich dann eben Sensoyammel-Dateien, die heißen halt immer Pupsback oder Pupsback.yammel und da kann man in dieser Yammel-Syntax eben zum Beispiel irgendwelche Dependencies festlegen, dass man zum Beispiel sagt, okay, diese Klasse braucht auf jeden Fall dieses Meter Package in einer gewissen Version und dann kann ich eben mit diesem Package-Manager, den es da auch gibt, von Dart eben mit PupGet dieses Package gleich mit installieren. Das heißt, da gibt es auch ein Package-Manager, den gibt es dann bei Flutter auch noch mal plus, der heißt dann nicht Pups, sondern Flutter, interessanterweise. Da heißt dann Flutter Get, das sind wieder die Aufrufe desgleichen noch mal. Man kann auch Annotationen programmieren, also diese, was man auch in Java und so weiter kennt, dass man diese mit Add Require zum Beispiel so eine Annotation, die eben bei Meter mit drin steckt, das heißt, ich brauche diesen Parameter unbedingt und ich kann mir das eben sowas selber programmieren, indem ich dann eine Konstante und eine Klasse mache. Das ist dann auch so eine Konvention, dass ich dann die Klasse groß schreibe für diese Annotation und diese Annotation selber ist eben dann dieses Konst aus dieser Konst-Klasse hier. Also so wird funktioniert es dann. Man kann sich dann relativ leicht Annotation und selber machen, ist auch schöner als in Java, finde ich, weil eben die Syntax, die gleiche ist im Prinzip. Ja, Vererbung geht natürlich genauso. Also wie man es halt so kennt, es gibt hier die Klasse Person wieder oder Person. Es gibt dann auch Abstrakte-Klassen, Abstract-Klasse und ich kann dann sagen, okay, Student-Exchange-Person und dann erbt ihr natürlich alles von Person, die Student-Klasse. Was es nicht gibt, sind Interfaces, also sowas wie dieses Keyword-Interface gibt es nicht. Das muss man dann eben alles mit Abstrakten-Klassen machen, aber im Prinzip, wenn man keine Methoden implementiert, ist ja das im Prinzip wie ein Interface. Deswegen haben die das Interface-Keyword einfach weggelassen. Was man hier noch sieht, es gibt erstens mal der Super-Konstruktor, den ruf ich dann hier wie in C-Sharp, mit Doppelpunkt Super oder wie in C++ auch auf und reicht dann eben da die einzelnen Parameter von dem Konstruktor durch an die Elternklasse. Es gibt noch, da kann ich auch Asserts mit reinbauen, dass ich sage, Asserts, gewisse Sachen müssen eben Bedingungen, müssen eingehalten werden, die kann ich da auch nur mit einbauen. Es gibt auch noch sowas wie Mixins oder es gibt Mixins und es ist dann natürlich so eine Art Mehrfachvererbung, das heißt, ich kann da irgendwas mit einklinken, irgendwelche Aspekte, dass ich sage, ich hätte gern zum Beispiel dieses Mix-in-Learner mit drinnen, das eben, was ich lernen kann. Ich meine, es kann ja vielleicht das Student lernen, es kann aber auch jemand anders lernen und dann kann ich das natürlich damit einbauen. Das ist natürlich auch vielleicht eine ganz sinnvolle Sache. Dann, was interessant ist, sind solche Dinge wie diese Async und Await Keywords, die eben jetzt nicht blocken. Das heißt, man kennt sie ja vielleicht auch von JavaScript und so. Es ist ja ermöglicht halt sowas wie Single Threaded Anwendungen, dass ich sage, ich mach was und danach passiert irgendwas. Also, das heißt hier, da kann ich das Async Package noch einbinden, muss ich aber heutzutage nicht mehr bei der 2.0 Version und da gibt es eben sowas wie Futures und das heißt, und die können auf irgendwas warten. Das heißt, ich kann hier sagen, dieses Ge-File-Path, das gibt mir ein Future-Objekt, dann kann ich Punkt Then sagen und wenn das quasi ausgeführt worden ist, dann wird der Code da drinnen ausgeführt. Also, ja und das heißt, wenn ich diese Foo-Methode anschaue, dann wird eben dieser Aufruf gemacht und dann wird aber gleich oder danach, das weiß ich nicht, eben diese Zeile ausgeführt und dann, wenn eben dieser File-Path eben angelegt ist, das File, dann wird erst dieses Then ausgeführt. Das heißt, weil das Ganze wird eben mit Async eben gekennzeichnet. Es wird ein neues File eben erzeugt, natürlich mit dem Namen, den ich hier habe und es wird dann so lange gewartet, das geht ja auch nicht instantan, bis das File eben angelegt worden ist und dann wird der Path jetzt zurückgegeben und zwar nicht als String, sondern als Future-String und dann wird eben mit dem Punkt Then, eben dieser String, dann da wirklich wieder weiterverarbeitet und das hat man natürlich in Flutter auch relativ häufig, dass ich es irgendwie nicht blockende Sachen programmiere und dass ich, das macht zum Teil ein bisschen anstrengend auch das Ganze, weil ich immer nicht weiß, was, wann passiert oder so. Das ist natürlich schon auch ein bisschen ein Nachteil, aber ich denke, es ist immer noch besser als irgendwelche Threads oder so, weil es ist schon irgendwo klar und wer Chabas kripp programmiert, der weiß auch ganz gut, wie das irgendwie funktioniert irgendwie mittlerweile. Also das merkt man schon auch, diese Verwandtschaft zu Chabas gibt. Gut, da gibt es noch ein paar Quellen dazu, eine Homepage, Sample Code, es gibt verschiedene Datepads, da kann man quasi im Browser mal probieren und programmieren und so weiter. Es gibt eine sehr gute Dokumentation und da sieht man auch das Google des Ernstbeins, denke ich, auch mit Flutter und dort, weil die Dokumentation sehr gut ist mittlerweile, also die Online-Dokumentation. Genau, es gibt diese Coding Conventions, das ist auch interessant, weil sich die Trabaz unterscheiden. Jetzt wollte ich noch, wir haben uns ein bisschen Gas geben, ein bisschen was über Material Design noch sagen, weil nämlich das im Prinzip dieses Design Paradigma ist, mit dem eben jetzt das ganze Flutter eben arbeitet und das ist so, das ist eigentlich schnell erklärt. Es gibt ja, was früher bei Apple da war, diese ganzen gläsenden Dinger oder so, oder auch bei Windows, mit den Kanten, die so irgendwie abgefasst waren. Das nennt man irgendwo Skeomorphismus, das ist im Prinzip, man tut so, als ob es irgendwas ist, nämlich echt. Es ist aber nicht echt, sondern es sieht ja nur so aus. Also das ist einfach so eine Art Täuschung und dann hat sich natürlich da damals eben Microsoft vorgewagt und hat sich gedacht, jetzt machen wir alles komplett flach. Das war ja schon mal echt revolutionär dann auch, im Gegensatz zu dem, was früher alles da war, das war auch schick. Und jetzt hat eben Google und ich denke auch, die anderen sind ja dann, die waren dann die ersten mit dem Material Design, da ist natürlich auch jetzt Apple auch wieder mit dabei. Die haben sich dann gedacht, die machen so eine Art Mischung aus dem Ganzen, das heißt, die geben dem dann irgendwie Schatten im Prinzip. Also im Prinzip kann man sich das so vorstellen, wie so und das ist wohl auch diese Metapher, die die da immer ranziehen. Das sind wie so Karten, die ich übereinander lege. Also die haben tatsächlich auch eine Dicke, das heißt, die haben so einen Density Pixel Dicke und die haben eine Höhe. Also die schweben dann, das ist dann diese Elevation, die kann ich ja einstellen, bei den meisten Flatter Widgets kann ich die einstellen und das heißt, das liegt irgendwie so übereinander und das ist halt so ähnlich wie von oben beleuchtet. Das ist eigentlich das, das andere, was jetzt dieses Material Design auch ausmacht, das habe ich jetzt da nicht erwähnt, da kann man auch nochmal nachlesen. Das ist einfach so was wie Animation. Also da wird halt viel versucht, über irgendwelche Animationen zu machen. Das heißt, da bewegt sich viel. Das wirkt eben dadurch flüssig und smooth, weil es eben sehr schnell geht ohne Ruckling und so weiter. Aber diese Metapher ist eben jetzt dieses Karten übereinander legen. Es ist, glaube ich, auch nicht so schön, wenn man dann Sachen zum Beispiel ausblendet, dass da irgendwas sich dematerialisiert. Das gibt es dann auch nicht so schön, weil es ja, man kann Karten quasi nicht plötzlich verschwinden lassen. Man kann die aus dem Screen rausziehen und rein tun. Da ist irgendwie Vogelgeräusch im Nachbargebäude oder was es sich da außen tut sich was. Ja gut, bloß nur für den Fall, dass man das auch hört, irgendwie vielleicht im Stream oder so. Da sind Geräusche von draußen. Ja genau, jetzt flatter. Was ist jetzt flatter? Das ist eben jetzt vor allem ein UI Toolkit. Es hat vor ein paar, eben das war so Ende des Jahres, glaube ich, letzten Jahres, meine ich, gab so Gerüchte, dass die eben jetzt innerhalb von zwei Jahren Google Android komplett einstampfen, hat es geheißen. Also das heißt, das war irgendwie so der Schock und irgendwie, wo ich mir gedacht habe, da muss ich jetzt was anders lernen. Es hat sich jetzt wohl mittlerweile anders dargestellt, aber nichtsdestotrotz gibt es dieses Betriebssystem. Das wird entwickelt. Die sagen jetzt, das ist nur ein Experiment, aber ich weiß nicht, ob man so viel Arbeit in der Experiment steckt. Es ist auch so, dass natürlich jetzt das flatter ist eben jetzt diese Oberfläche, in der wird eben die Oberfläche für dieses Foxia Betriebssystem entwickelt. Ja egal, ich will da nicht zu viel darüber erzählen, da kann man alles nachlesen auch. Es ist eben diese Anwendungsprogrammierung läuft eben dann mit flatter. Das Schöne ist, man kann jetzt schon mit flatter natürlich programmieren und zwar für Android und iOS eben Plattform übergreifend. Das ist ja das Schöne dran. Also das funktioniert auch wirklich. Wobei, da gibt es natürlich Einschränkungen, erzähle ich vielleicht gleich noch was. Auf jeden Fall kann man damit schon was machen und es ist ja immer gut, wenn man eine Code-Basis hat. Also das ist ja auch, es gibt ja andere Frameworks, die das natürlich auch leisten. Das Tolle an dem Ganzen ist, aber das muss man wirklich hervorheben. Das ist jetzt net, wie manche Plattform übergreifende Frameworks sowas macht, wie irgendwie ein Web Browser auf und da irgendwelche JavaScript Sachen reinprojiziert, sondern es ist wirklich quasi wird runterkompiliert zu nativen Armcode und die liefern eine eigene quasi Render-Engine mit aus, die eben komplett bis runter geht ins System und das Ganze auch sehr performant macht. Also das ist eigentlich das Tolle dran. Ich sehe schon, ich muss mich wirklich ein bisschen schicken. Okay, aber das ist vielleicht auch ganz wichtig. Also dass halt eben die Sachen eben sehr performant sind. Dass es eben nicht nur so eine Art JavaScript-Übersetzung ist und es ist modern, also mit Reactive-Methoden. Genau, Installation kann man nachlesen, speich mir jetzt einfach mal. Genau, vielleicht interessant ist, dass alles Widgets sind. Also Widgets ist eben dieses, ich habe mal nachgelesen, Dingsbums würde ich sagen. Da kann man übersetzen mit Dingsbums, also Gadget Windows Gadget, Dingsbums für den Bildschirm. Gadget heißt eben Dingsbums. Und Widget ist ja so ein Begriff, der eben ein zusammengesetztes Wort ist, eben aus Windows und Gadget. Und es ist eben alles ein Widget und da sieht man mal, da habe ich mal versucht, das so zu gliedern irgendwo. Es gibt vor allem zwei Dinge. Es gibt ein Stateless Widget und ein Stateful Widget und wie der Name schon sagt, Stateless hat natürlich keinen State. Das sind diese Final, diese Immutable-Klassen auch, die da drinstecken irgendwo. Das heißt, zum Beispiel Text ist dann einfach was, was in Immutibles, das wird dann nicht mehr geändert, ich muss da einfach einen neuen Text machen. Und dann gibt es natürlich Stateful Widgets und die können dann eben einen Zustand haben und den Zustand muss ich aber extra programmieren. Das muss man auch sagen, also das ist vielleicht auch ganz wichtig, vielleicht auch, wenn wir jetzt nicht mehr komplett durch den Code gehen können dann am Schluss. Es ist auf jeden Fall wichtig zu verstehen, dass die Stateful Widgets haben einzelne States und die muss ich natürlich extra implementieren. Das heißt, ich habe da verschiedene States, die zu passend zu einem Stateful Widget immer da sind. Das kann man vielleicht gleich mal an einem Beispiel sehen. Und die haben dann immer auch genauso wie diese Stateless Widgets, eine Methode Build und die bekommen den Kontext mit. Der Kontext ist quasi die Umgebung, die von außen oder auch die Eltern Widgets, die kommen damit rein. Genau und da kann ich dann verschiedene States mit einer Methode Set State ändern. Das sind dann einfach State Variablen, die ändere ich dann. Ich gehe zwar mal schnell durch, was da noch gibt es dann natürlich sowas wie Navigation. Da gibt es eben dann Navigators und dann Routes. Aber Routes sind eigentlich nichts anderes wie auch irgendwelche Widgets natürlich. Und Routes, also wie ich das immer so verstehe, man könnte eigentlich auch sagen Screens. Also man kann Sets auch Screens senden können. Aber Routes ist natürlich irgendwie so eine Art Navigationsroute. Also das heißt, die kann ich irgendwie mit, sieht man hier mit Push und Pop irgendwo in die Navigation, in den Navigator reintun und mit Pop wieder raus. Das ist so wie beim Browser vor und zurück navigieren, kann man sagen. Also das ist eigentlich das, was ich mit diesem Navigator mache. Und dann zu guter Letzt gibt es eben noch Widgets, die sind im Prinzip unsichtbar. Das sind dann solche Dinge wie zum Beispiel allein oder Center. Das heißt, da sieht man schon auch diese ganzen Lehrarztgeschichten, die man so hat, wo ich dann eigentlich sichtbare Widgets reintun. Also zum Beispiel Center kann ein Child haben. Das kann natürlich wieder ein Widget sein, zum Beispiel Text. Also so kann ich das im Prinzip aufbauen, das ganze. Gut, das sieht man auch schon. Jetzt wird es vielleicht nochmal klarer, was ich da mein. Also es gibt keine, wenn man jetzt Android entwickelt, gibt es ja so irgendwelche XML Layouts und sowas. Und auch in, was ist ich, .NET oder so. Das gibt es hier nicht. Es gibt quasi keine weitere Sprache. Und zwar deswegen, weil eben Dat mächtig genug ist, um das ganze sowas wie XMLer auch abzubilden. Und hier zum Beispiel, da sieht man jetzt mal auf der rechten Seite, habe ich jetzt einfach mal so eine Art HTML oder XML Struktur und das gleiche hier in Dart, weil ich habe diese benannten Parameter, habe ich, glaube ich, gerade zu kurz erwähnt. Es gibt benannte Parameter in Dart und Padding, könnte ich auch schreiben New Padding, mache ich aber nicht, weil ich brauche das New nicht. Und da habe ich zum Beispiel hier einen benannten Parameter, nämlich auch wieder Padding und der bekommt dann wieder ein Widget, nämlich so ein Layout Widget mit. Und ich sage dann, okay, die Ecken sollen irgendwie ein Rücken acht Pixel in jede Richtung. Und als ein Child bekommt das Padding dann zum Beispiel ein Center Widget und das ganze bekommt dann ein Text Widget und da steht dann Hallo drauf. Also das wäre im Prinzip sowas wie in XML oder in HTML würde ich es jetzt so ausdrücken. Und das ganze kann ich natürlich hier in Dart und in Flutter eben auch machen mit Dart an sich. Und es gibt auch an sich, jetzt werden wir das ganze installieren, Android Studio oder ich habe das jetzt auch einmal, arbeite hier gerne mit Visual Studio Code, dann hat man da keinen Layout Bilder, wo ich dann irgendwie Sachen rumrutsch und dann hin und her ziehe. Das mache ich da eigentlich nicht, weil ich meine, man kennt es ja auch, vielleicht haben sich einige schon geärgert mit diesen Layout Bilder, dass das einfach nie ist, das ist was man eigentlich haben will. Das ist halt, what you see is what you get, aber nicht, what you get is not always that, what you want, im Prinzip kann man sagen, das ist halt das. Ja, ich zeige mal kurz so eine Art Layout Struktur, da geht es darum einfach mal eine Liste aufzubauen, das sieht man jetzt hier, muss jetzt echt mal ein bisschen mich schicken. Man hat hier im Prinzip einen List View und in dem List View hat man dann so schön geinkte Sachen drin, zum Beispiel einfach irgendwelche Zeilen und die Zeilen bestehen dann eben aus dem Icon und dem Text. Das soll jetzt, das soll einfach Fußballergebnisse als Tabelle quasi sein irgendwo und das kann man eben hier so aufbauen und das Ganze funktioniert dann eben auch, so da ist irgendwo eine Schleife drin, 30 Einträge jetzt hier mal fest reinkodiert, dann mache ich ein Inquel Element, also das ist im Prinzip hier eines von diesen Dingen und das ade ich dann zu diesen einzelnen Widget-Elementen in dieser Liste. Das heißt, da kriege ich dann eine Liste und die Liste, die wird dann eben hier als List View, eben als List View Widget, da wird die Liste übergeben mit Children und dann habe ich eine Liste. Also so funktioniert es dann und da baue ich mir, im Prinzip programmiere mir meine Layouts mehr, als dass ich die natürlich irgendwo visuell gestalte. Das Tolle, da kommen jetzt wahrscheinlich einmal dazu, es gibt dieses Hot Reload, das heißt während ich tipp und das Ganze wie der Speicher ändert sich, der Code wirklich im, ich kann es mal kurz zeigen, ich habe es dann offen, Moment, ich muss mal kurz, das mache ich jetzt schon noch schnell, zum Beispiel mein Spielchen, also ich habe da so ein Spiel gemacht, auch so ist es jetzt irgendwie vergrößert hier, muss da wieder kleiner werden, genau, Chicken Maze heißt das Ding, wenn ich jetzt die Namen zum Beispiel hier ändere, in Chicken Maze 2 und Speichere, dann müsste es eigentlich hier sofort Hot Reload, dann habe ich das Ganze gleich geändert und so kann ich eigentlich alles ändern, ich kann auch zum Beispiel hier die ganzen Layouts ändern, ich kann mal die Font Size auf 42 ändern und dann habe ich das eben gleich sofort in meinem Simulator oder auch am Handy geändert, spart man natürlich im Endeffekt viel Arbeit, ist die gute Nachricht, die schlechte ist das Funktion natürlich bei vielen Sachen nicht so gut, wenn nämlich ich irgendwelche Sachen initialisieren und danach nicht mehr anfassen, das heißt dann bleibt es irgendwie so, das heißt das spart man dann vielleicht schon beim Layout und beim Design die Arbeit und deswegen brauche ich eigentlich kein Layout-Bilder, weil ich sehe halt gleich am echten Ergebnis, wie es eben aussieht, also das ist eigentlich das Schöne dran, ja genau, dann kann ich natürlich auch dynamische Layouts aufbauen, ich habe hier so eine Adresse, das Beispiel kann ich ja noch durchgehen, wo ich zum Beispiel so eine Chasing Datei mit den, das war eben letztes Jahr, World Cup sind wir leider nicht so weit gekommen, da kann ich hier die Fußballergebnisse eben abrufen, das hat auch einer Live immer mitkodiert, das war dann auch ein weiterer Nerd, der eben das als auf GitHub eben hochladen hat, dann kommt man dann gleich abrufen, was man hier jetzt braucht sind diese Async-Dinge, das heißt da warte ich im Prinzip auf die Fußballergebnisse und da haben wir jetzt auch mal ein schönes Beispiel, das werde ich jetzt noch durchkauen, denke ich, das kann man glaube ich noch machen, für so ein Stateful-Widget, das heißt, weil es immer gleich aufgebaut ist, ich habe eben ein etwas, was von Stateful-Widget erbt und dann habe ich eine Methode, die ich überschreiben muss, Create State und die erwartet, also die will dann eben einen State vom Typ Stateful-Widget zurückgeben und dann mache ich hier einen State und der erbt jetzt von State Football App, also das heißt von meiner Stateful-Widget-Klasse, das ist dann dieses so als Generic, eben der Typ-Parameter, der State ist eben vom Typ Football App und den kann ich dann hier verwenden, da muss man, das muss man ein paar mal gemacht haben, um sich da irgendwo, ist ein bisschen schwierig da reinzukommen vom Denken her, auf jeden Fall habe ich dann hier diesen State und bei Bild macht er quasi auch wirklich dieses Ding hier, das heißt, das wird hier diese App, die wird hier gemacht, das wird aufgerufen, das Bild ist das Erste, es gibt dann ein Widget zurück, das dargestellt wird, es gibt eine Methode, die ich überschreiben kann, die heißt Init-State, wo ich Initialisierungen machen kann und was auch noch interessant ist der State-Saver, das ist im Prinzip alles an Variablen, den ich eben jetzt an Objektvariablen, die ich eben in dieser State-Klasse habe, zum Beispiel meine Liste an einzelnen Fußballergebnissen, das sind natürlich auch wieder Widgets, das ist ja klar, weil alles so Widgets ist irgendwo und ich muss immer eine Set-State-Methode verwenden, um die den State zu ändern und da sieht man auch, das ist so eine Lambda-Funktion, also hier Parameterklammern und hier geschweifte Klammern, das heißt, diese Set-State-Methode bekommt eine Lambda-Funktion und in der mache ich dann die Sachen, also das hat gewisse Gründe, das zu machen, weil eben das System immer überprüft, ob sich was da drin an Variablen geändert hat und dann wird eben das ganze Widget aktualisiert und neu gezeichnet, was man ja gerade schon gesehen hat, bei dem, wenn ich da jetzt ändert, also das ist eigentlich das, was sich hier dann tut, also das ist eben dann so Reaktiv Programmierung. So, ich gehe mal kurz weiter, ich verlasse jetzt dieses Fußballergebnis, ich wollte jetzt eben eigentlich noch das Spiel vorstellen, weil ich eben mir gedacht hätte, wie möchte ich mal versuchen, kann ich auch eine große echte Real-World-Anwendung machen, nicht bloß so kleine Spielchen, Beispielspielchen meine ich, sondern nochmal größere Spiel, habe das dann quasi auch durchprogrammiert und ich kann sagen, es funktioniert, da werden wir jetzt nicht mehr so ganz dazukommen. An sich gibt es da verschiedene weitere Packages auch, die ich eben nicht mit Pub, sondern mit Flutter Packages Get installieren kann, zum Beispiel eine Game Engine, die relativ rudimentär ist, die heißt Flame, mit der habe ich eben das Spiel auch umgesetzt, was man da vielleicht auch noch zu so einer Projektstruktur sagen muss, ich muss bei Flutter immer die Assets angeben, also auch die ganzen Bilder, die ich verwende oder auch zum Beispiel Musik oder so und die müssen dann in einem Pfad drin liegen, Assets relativ natürlich zu meinem Projektordner, die muss ich alle angeben und dann bei Packages Get werden die dann quasi auch mit aktualisiert, das heißt das muss ich dann auch machen, ich muss die Ressourcen alle angeben. Zu Flame vielleicht noch, ja das bietet jetzt relativ wenig, aber es reicht, das bietet animierte Sprites, das bietet Teilmaps, sowas wie Parallaxe, Physics, Audio und Input, das ist eigentlich das wichtigste, was ich brauche, ist halt der 2D Engine. Ja, ich habe dann zum Beispiel noch, das kann man noch als Tipp geben, es gibt einen Teilmap-Editor, der heißt Tiled, ist auch so ein Open Source Projekt, da habe ich auch verlinkt, wenn man die Folien irgendwie kriegt, damit habe ich jetzt zum Beispiel irgendwelche Labyrinthe dann gemacht, eben mit Ties und so, kann man dann abspeichern, das ist dann so eine XML-Datei, da geht es nicht näher drauf ein, da gibt es halt verschiedene Layers für Ties, das Ganze wird dann, muss man aufpassen, muss man auf Zlib Kompression stellen, sonst kannst du das Flame nicht lesen und da werden halt dann diese ganzen Teilinformationen eben gespeichert als komprimierte Teilmap und dann kann man das Ganze auch verwenden, man bindet einfach Tiled ein, man kann dann zum Beispiel eine Klassie Maze machen, Tiled-Komponent als Typ haben und kann dann eben eine neue Tiled-Komponent mit dieser TMX XML-Datei, die kann man dann einlesen und dann muss man natürlich schon sagen, okay, die wird da nicht eingelesen, dauert seine Zeit, deswegen braucht man so eine Future-Methode, da muss ich sagen, dann Ties.future-then, Initialize ist gleich true zum Beispiel, das heißt ich kann die nicht vorher sein, aber vorher ist es dann initialisiert, das Einladen geht instantan und dann kann ich halt dann Sachen machen und so und dann kann ich es am Schluss mit Ties.Random und habe dann im Endeffekt auch ein Ties am Bildschirm, ich kann es mal kurz zeigen, ich starte einfach mal das Spiel, mal schauen, jetzt bin ich hier wieder auf die, achts, mir verrutscht, die Maus, ich habe eine Maus, kann ich das ziehen, ah ja, okay, so, jetzt ist irgendwie weg das ganze, muss ich wieder schade, sollte ich es eigentlich zeigen, Vorführeffekt, es ist weg, das Spiel weg, ich rede einfach weiter dann und starte das ganze nochmal, vielleicht kommt es dann nochmal, so, okay, also Hot Reload, wie gesagt, ist so eine Sache, gut, es gibt Sprites, da kann ich nochmal kurz das erzählen, wie das mit den Sprites funktioniert, ich kann da so eine Sprite-Map machen mit verschiedenen Animation-Stufen, jetzt vor dem Hund zum Beispiel, das ist hier so, da unten die Idol Animation, das zieht den Kopf ein und macht das Auge zu und dann kann ich eben eine Animation machen mit Variable Sequence, kann ich sagen, okay, ich hätte gerne verschiedene, also dass die nicht immer gleich lang da bleiben sollen, ich gebe hier einfach die Länge als Liste an, sage eben hier 20 Frames oder 20 Sekunden, 0,5 Sekunden, eine Sekunde, also er guckt nur mal kurz nach vorne, eine Sekunde macht das Auge zu und so weiter und 5 Sekunden guckt es eben so, also das kann ich machen, dann gebe ich die Position an, das heißt, in meinem Time-Map, also X-Position 0, Y-Position eben rasterweit mal 2, also dann die unteren und dann kann ich eben sagen, okay, dann kann ich sagen, das soll auch loopen und dann habe ich eine Animation, diese Idol Animation, dann kann ich dann mit Get eben verfügbar machen und dann kann ich das Ganze also in meiner Render, in meiner Render-Loop dann auch verwenden und kann dann einfach sagen, okay, Current Animation ist Animation Idol, wenn ich eben nichts mache, längere Zeit und dann kann ich die Animation updaten in der Render-Loop und kann dann sagen, okay, ich hole mir den Sprite und render den an der Position in meinem Zeichenobjekt, das kennt man ja vielleicht auch schon so ähnlich ist es dann auch wieder wie bei eben jetzt früher auch bei Android und kann dann eben die Position angeben, da gibt es eine extra Klasse dafür, wo ich eben zwei X und Y Komponenten eben jeweils um die Position anzugeben, genau, und dann kann ich das Hunden da zeichnen, ja genau und das Ganze wird dann eben eingebunden, jetzt haben wir auch schon das große und ganze hier in eine Klasse, die leitet von Base Game ab und die Methode Render, die ich dann überschreib, die gibt mir dann eine Zeichenfläche, ein Canvas Objekt und auf das kann ich dann zeichnen, ich kann auch Scale, Translate machen, kann dann quasi meine Timel rumschieben in irgendeine Position, kann dann meine, was ist das ich, meine, mein Labyrinth render und dann eben das Chicken drauf und kann dann zum Beispiel sagen, okay, wenn die leben von dem Chicken, also wenn ich sage, das ist jetzt zu uns oft gekillt worden und dann ist es eben weg, meine Leben, dann kann ich zum Beispiel sagen, ich navigier mit diesen Navigator in so ein Game Over Screen und dann kann ich sagen, Navigator of Context, dann hier Push Replaced, Named, Game Over Page, Punkt Rout und das ist eben einfach nur ein String, den ich da angeben kann und dann eben sucht sich der, der entsprechend ins Grün raus und wechselt, genau. Schauen wir mal, ob das mit dem Chicken noch funktioniert, irgendwie mag das Ding jetzt gar nicht mehr, ich bin da irgendwie reingesummen, wieder raus und jetzt ist es irgendwie weg, ja, also es funktioniert, ist halt jetzt gerade nicht anschaulich, ach so, es tut immer noch, ja gut, also das dauert nicht dann schon manchmal, das heißt irgendwie, sorry, das erste Mal starten und manchmal dauert so ein bisschen, muss man warten, manchmal braucht es ja irgendwie Internet oder so, ja, keine Ahnung was jetzt ist, es installiert noch und da warten wir jetzt aber nicht so lange, wie gesagt, ich habe ja vor das Ganze dann irgendwann mal auch in den App Store zu laden, Chicken-Massie, weiß ich nicht, ob ich es umbenennen, ich werde es vielleicht auch irgendwie Open Source machen und dann irgendwie auf GitHub als Referenzspiel hochladen, damit man mal schauen kann, wie so eine größere Anwendung funktioniert, also ich habe dann auch alles mögliche versucht, zum Beispiel so was wie, was es sich, Werbeeinblendungen, die Verknüpfung mit irgendwie Firestore und die ganzen Sachen, die man so eigentlich braucht, mit was es sich serverseitige Anbindung, Mehrsprachigkeit und so, das ist alles mit implementiert, da fehlt uns natürlich die Zeit, ich habe halt einmal versucht, alles zu implementieren, was man eben so braucht, um eben jetzt ein Spiel zu machen oder überhaupt einmal eine vernünftige Sache, weil bisher habe ich eben nur so kurze Beispiele gefunden, die eben jetzt nicht irgendwie quasi halt Realitätsnah sind und da habe ich programmiert, so mal eine größere Sache und es war, muss man auch sagen, erst mal nicht so leicht, weil es sich auch zum Teil was geändert hat, zum Teil auch an diesen Packages, was geändert hat, auch bei dem Flame zum Beispiel, als immer wieder was geändert, dann muss man das ganze wieder komplett umarbeiten, es ist halt noch viel im Fluss, aber es glaube ich lohnt sich, weil wie gesagt, es verlockt halt dann auch mit Multi-Plattformen Programmierung und was ich jetzt oder was sie vielleicht auch schon gelesen haben, die letzten Meldungen waren ja irgendwie, dass es da auch sowas gibt, wie was es sich Desktop-Versionen oder auch Web-Versionen von dem Flutter, das heißt, da kann man bestimmt dann auch mit einer Code-Basis relativ viel machen und ja, das waren jetzt so meine Erfahrungen und ich hoffe, das war jetzt so auch ein guter Überblick und bedanke mich fürs Zuhören und ich habe hier noch ein paar Links, ich hoffe, die kann man dann alle auch irgendwie noch mal nachlesen oder nachschauen, wenn man dann sich das ganze noch mal vielleicht irgendwie halt dann noch mal als Video anschauen will, dann Media-CCC, kann man das ja dann bestimmt sehen und da kann man die Links auch sehen. Jetzt würde ich sagen, gibt es noch Fragen? Ich meine, wir haben ja Zeit, glaube ich, ein bisschen, weil danach gibt's ja keine Talks mehr, aber jetzt habe ich gerne noch, eben bin ich eben so, ja, sieht man mal, okay, hoppala, ja, gut, das war jetzt nicht beabsichtigt, ja, Downsend, es geht, ich kann es jetzt noch mal versuchen, weil jetzt ist es ja endgültig abgestürzt, das ganze, jetzt machen wir, vielleicht kommt ja das Spiel am Schluss noch mal irgendwo, halt, so, was nehmen wir denn das Ding? Schauen wir mal, ob es da noch mal startet, dann sehen Sie es vielleicht sogar noch am Schluss oder Ihren, genau, okay, gibt's Fragen, endgültig jetzt mal. Oh, kannst du mir, gehen wir von vorne nach hinten oder gehen wir auf die ersten, weil die Hinterrenner waren zuerst da, ja, bitte. Ja, vielen Dank, vielen Dank für den Talk. Ja, ich wollte fragen, wie es in DART und Flatter da immer noch aussieht mit testgetriebener Software Entwicklung. Bitte, mit was? Mit testgetriebener. Ach so, ja, sehr gut sogar, also da gibt's sogar, es werden auch immer Tests mit angelegt, wenn man zum Beispiel mit Android Studio arbeitet, legt ja auch immer extra so einen Testordner an. Was da auch interessant ist, es gibt wirklich so Art GUI-Tests, das heißt, man kann sowas simulieren wie Push auf irgendwelche Buttons oder irgendwelche, also man kann sagen im Testfall drücke auf den Button und dann erwarte ich das und das, also das heißt, man kann wirklich diese GUI auch testen, das ist da auch mit integriert, das funktioniert auch sehr gut, habe ich auch schon probiert, ja, also wie gesagt ist auf jeden Fall mit drinnen und sogar diese, weil es ist ja vor allem GUI Framework, würde ich sagen, und da gibt es eben auch diese GUI-Tests, Fälle, die da eben, die man da mit anlegen kann. Da gibt's dann so einzelne Keys, wo man dann die einzelnen Dinge eben mit so einer ID versenken kann und dann auf diese ID eben irgendeine Aktion auslösen kann. Also das kann man dann relativ schön machen. Das heißt, jedes Widget hat so eine, so einen optionalen Parameter Key, wo man eben individuellen Key eine ID reingeben kann und dann durch eben die wieder die Sachen identifizieren kann und dann eben sagen kann, was sie sich on-press oder sowas sagen, genau. Okay, noch, war das jetzt soweit? Ja, gut. Hallo, ja, Sie haben vorhin die Confix angesprochen, XM-Examel oder wie Sie hieß? Ja, Jamel, ja. Kann man sich das be-maven vorstellen, dass man an die Pentensies runterraten kann oder ist es was anderes? Ja, es ist schon so ähnlich. Es ist halt, es ist erstes Mal Konfiguration und auch Package-Management. Das heißt, da werden einfach, da wird geguckt, was habe ich für Abhängigkeiten auch. Das heißt, ich kann das auch relativ, da gibt es sogar eine eigene Syntax dann von dieser Versionierung. Da haben wir gesehen, da gibt es dieses Dach-Symbol. Das bedeutet, dann eben bis zu der und der Major-Version möchte ich irgendwas, kann ich was verwenden und so weiter. Also das heißt, ich kann da so größer, kleiner und gleich Ausdrücke auch angeben, wo ich angeben kann, was für Versionen eben mein Ding benötigt und so. Und dann wird es auch über dieses Flatter-Get oder Pub-Get eben in so eine Art Repositorie eben dann runtergeladen und dann kann man das verwenden. Sehr gut, danke schön. Zweite Frage noch, welche Endgerät kann man mit dem kompetierten Code erreichen? Ja, das kommt jetzt drauf an. Also normalerweise funktioniert es wirklich eins zu eins auf Android, Ruppler, jetzt habe ich es schon wieder, auf Android und auf iOS. Das sind also so die, würde ich sagen, die Zielplattformen, Android und iOS. Und ich würde auch sagen, dass Android mehr, trotzdem mehr unterstützt wird. Das liegt einfach daran, dass wenn ich zum Beispiel so eine Erweiterung selber schreibe und dann hat Tief irgendwas anbinde, dann muss ich das natürlich machen für Android in Java, meinetwegen, oder was es sich, was halt da gibt für Sprachen. Und dann muss ich das gleiche aber noch für iOS auch noch machen, in Swift oder so. Das heißt, ich muss das dann beides implementieren. Und dann kann es ja nicht passieren, dass das eine, die eine native Implementierung in einem Bug hat und die andere nicht, oder so. Das gibt es auch, dass die das nicht so gut testen oder dass es zum Beispiel eine fehlende iOS Implementierung gibt oder so. Da muss man halt dann, da gibt es auch so Verzeichnis auch auf irgendwo Flutter Packages. Gibt so eine große Verzeichnis. Da sieht man dann, was da da ist. Meistens ist es dann auch auf GitHub. Da kann man auch in den Code reinschauen. Und was jetzt in Zukunft vielleicht noch zu der Frage, was da noch unterstützt werden soll, ist ja auch eben, wie gesagt, Desktop Anwendungen. Und immer soll eben, was es ich, Windows, Linux oder Mac OS X Desktop Anwendungen machen können. Man soll auch, gibt es wohl auch schon experimentell für irgendwie so Geräte wie Raspberry zum Beispiel kann man es auch schon nehmen. Es gibt auch jetzt eine Web Version. Da funktionieren natürlich diese Plug-Ins dann wieder nicht mehr. Wenn man sagt, da habe ich jetzt irgendwas, was am Handy funktioniert, was jetzt zum Beispiel auf einen Sensor reagiert oder so, Beschleunigungssensor geht es natürlich nicht auf dem Web raus oder dann in dem Sinn erst mal. Aber es soll wohl wirklich so eine quasi universelle GUI Anwendung sein. Und das ist schon spannend, finde ich. Da kann man sich schon darauf einlassen. Und vor allem ist, finde ich, auch die Programmierung relativ nah an dem, was man ja so kennt. Eine letzte Frage noch. Bei Flame, wie sieht das bei den Lizenzen dort aus? Ich bin mir jetzt, ich habe es mir angeguckt, aber ich weiß es jetzt nicht ganz, aber ich glaube, das ist auch komplett frei. Also das heißt, da gibt es ja Github Repository, da kann man auch schauen. Da gibt es so eine Readme MD Markdown, da steht dann bestimmt auch was über die Lizenz. Wobei, ich denke, dass es komplett frei ist das ganze Jahr. Also das ist eben so, also ich schaue ja schon immer auf die Lizenzen, wird auch jetzt nichts verwenden. Ich habe da bis jetzt eigentlich noch nichts gesehen, was jetzt irgendwo eingeschränkt wird. Also das ist im Prinzip alles. Ich weiß jetzt nicht, welche Lizenz das direkt ist, aber das sind glaube ich sehr offene Lizenzen, sodass man das eben was Wichtiges eben auch für kommerzielle Projekte verwenden kann. Das darum geht es ja eigentlich. Und soweit ich weiß, ist es natürlich schon auch so. Vielen Dank, schöner Vortrag. Danke. Fragen, da gibt es noch, ich glaube, weiter vorne. Jetzt waren Sie noch mal, Sie mit dem Bart, vielleicht noch, weil der Herr, der sitzt hier in der vierten Reihe, genau, weil der war glaube ich jetzt schon länger. Ja, die Frage wäre, kann ich mit dem Dart direkt auf zum Beispiel das Android API zugreifen, also zum Beispiel direkt ein Sensor abfragen? Nein, also das heißt, ich muss eigentlich so eine, ich kann im Prinzip schon nativ programmieren, aber ich brauche quasi eine Gegenstelle. Das heißt, ich muss im Prinzip so eine Art Methode aufrufen, die mir das dann irgendwie eine Methode als String übergibt irgendwie und dann muss ich das irgendwie auswerten. Also das heißt, ich kann sagen, ich sende Nachricht und kriege dann, empfange die dann auf der nativen Seite, werte die aus und sende die zurück zu meinem Dart oder zu meinem Flatter. Okay, wie bin ich dann das Nativer ein? Muss ich dann eine komplette zweite App schreiben oder eine Library? Nein, also man macht das, ja, also es ist eigentlich relativ simpel. Man macht halt einfach eine Java-Klasse und da ist halt meine Methode drindig aufruf und diese, es gibt halt wahrscheinlich mal gerade Finde, also ich habe halt hier meinen, diese ganzen Dart-Files, die sind in so einem Lib Verzeichnis und dann gibt es natürlich hier auch noch irgendwo ein Android Verzeichnis, Moment. Ja, manchmal, da seh ich dann immer den Wald verlater Bäume nicht, genau, dann geht es halt hier irgendwie rein und da irgendwo da drinnen, genau, hier, da gibt es hier, gibt es, das habe ich hier gar nicht verwendet, da kann ich hier im Prinzip eine Methode schreiben, die sowas empfängt so ein Signal und dann, also hier drinnen direkt und da kann ich halt sagen, okay, liest den Sensor aus, schickt ihn wieder zurück und so. Also das wird ja quasi auch immer mit, automatisch mit reingeneriert, also wenn ich quasi jetzt, sonst könnte ich die Anwendung ja gar nicht starten, es wird quasi so ein Android-Skelett noch mit reingeneriert und da kann ich aber Code noch reinschreiben und auch ergänzen und so, genau. Dankeschön. Weitere Fragen. Ja, ich habe Zeit, also wir haben ja danach, glaube ich, keinen Talk, Sie können den ganzen Abend fragen. Also für eine Frage haben auf jeden Fall noch Zeit. Genau. Es waren gerade, hier ist noch jemand, da auf der anderen Seite, ja genau. Ist es eine Gabelsch-Collection Sprache, das Dart und wie gut funktioniert hier, also wie performant ist die? Ja, Moment, jetzt muss man drüber nachdenken. Also es ist auf jeden Fall nicht so, dass man irgendwelche Destrukturen oder so oder Objekte wieder zerstören muss, das muss man nicht machen. Das heißt, es gibt eine Gabelsch-Collection, das ist aber auch so, dass die das ein bisschen vermeiden wollen und zwar durch diese unzerstörbaren, immutable Sachen. Das heißt, die sind final, das heißt, die verändert sich an immer und die sind relativ performant und so, wie ich das jetzt auch gesehen habe, sind die quasi auch performanter als die Sachen mit einem State, weil die muss man quasi dann immer wieder händeln und so. Und mit der Gabelsch-Collection an sich, da kann ich jetzt eigentlich nichts drüber sagen, die gibt es ziemlich sicher, weil sonst wird es nicht funktionieren, das Ganze. Aber da habe ich jetzt, ehrlich gesagt, mich jetzt gar nicht so damit befasst. Aber es ist auf jeden Fall mit Gabelsch-Collection, es gibt kein Delet oder so was. Oder ich muss keine Destrukturen aufrufen oder so. Danke. Okay, noch Fragen? Okay, bitte. Ach so, das Chicken, ja jetzt zu guter Letzt. Schauen wir mal, ob es jetzt läuft. Das heißt, jetzt start game und dann muss ich hier noch vielleicht irgendwelche Namen eintragen und genau kann ich jetzt mal hier das Ganze starten und dann kann ich rumlaufen, gibt es sogar Sound dazu wahrscheinlich. Das ist irgendwie wieder egal, ohne Sound diesmal. Ich laufe jetzt mal los hier, dann die Körnchen sammeln und ich habe da, also der erste Level ist halt recht klein, da habe ich dann irgendwelche Kraftpillen, da kann ich dann den Fuchst fressen sogar und kann dann durch. Und genau. Und jetzt, gut, da habe ich jetzt was geändert, jetzt müsste er eigentlich, jetzt bringt er nämlich eine Werbung, das heißt, er lädt jetzt Werbung, Internetverbindung ist schlecht, aber jetzt geht es weiter. Und jetzt kann ich halt hier irgendwie, das dauert offensichtlich, manchmal unterschiedlich lange, dann kann ich halt hier irgendwie weiterlaufen und kann hier, oh, Mist, jetzt kommt wieder Werbung, genau. Und ja, das ist halt jetzt doof hier zum Steuern auch, ich muss mal die Maus nehmen, dann gibt es jetzt besser, genau. So, dann kann ich halt, oh, schon wieder. Okay, aber das war schon, also so funktioniert das dann im Wesentlichen, genau. Irgendwann ist Game Over, ich kann mal kurz, jetzt ist bestimmt gleich Game Over, ich versuche mal da, mich da um die Ecke zu schleichen hier. Ja, genau, da habe ich so, kann ich irgendwie Türen öffnen, bin dann im nächsten Level, Werbung weg, genau. So, Game Over, ja, genau. Okay, so ist es dann, kann dann auch jetzt hier zum Beispiel mal auch so eine High School-Liste abfragen und so weiter. Genau, das ist jetzt hier meine, okay. Klar, gut. Ja, das war das Chicken, ja, genau. Dann bedanke ich mich fürs Zuhören und wünsche noch viel Spaß euch.