Flutter: Unterschied zwischen den Versionen

Aus CodicaTipps
Zur Navigation springen Zur Suche springen
 
(15 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 5: Zeile 5:
  
 
Als Programmiersprache wird [[Dart]] genutzt. Die Benutzerelemente sehen zwar aus wie native Elemente; sie werden aber auf Pixelbasis von den Flutter-Komponenten selbst errechnet.
 
Als Programmiersprache wird [[Dart]] genutzt. Die Benutzerelemente sehen zwar aus wie native Elemente; sie werden aber auf Pixelbasis von den Flutter-Komponenten selbst errechnet.
 +
 +
== Projektstruktur ==
 +
 +
Zur grundsätzlichen Struktur eines Dart-Projekts (package) siehe
 +
* https://dart.dev/tools/pub/create-packages
 +
* https://dart.dev/tools/pub/package-layout
 +
 +
Ein Package umfasst ein oder mehrere Libraries. Eine Library ist üblicherweise ein Dart-File (Ausnahme: Einbindung anderern [generierter] Dateien mittels <code>part</code>-Direktive).
 +
Libraries im lib/-Verzeichnis sind public, wogegen solche im lib/src-Verzeichnis privat sind.
 +
 +
Wenn man Flutter benutzt kann man die Struktur durch
 +
  flutter create
 +
erzeugen lassen.
  
 
== Programmierparadigmen ==
 
== Programmierparadigmen ==
Zeile 45: Zeile 58:
 
Siehe  
 
Siehe  
 
* https://github.com/dart-lang/sdk/issues/44848
 
* https://github.com/dart-lang/sdk/issues/44848
 +
 +
=== JSON ===
 +
 +
==== JSON serialization ====
 +
 +
Dart hilft beim Einpacken von Daten in JSON und dem Auspacken. Allerdings ist es nicht [[JavaScript]] oder [[TypeScript]], das ein first-class-Handling von [[JSON]] ermöglichen.
 +
 +
Hilfreiche Libraries sind
 +
 +
* json_serializable
 +
* built_value
 +
* deep_pick
 +
* [https://pub.dev/packages/equatable equatable]
 +
 +
Siehe auch
 +
* https://codewithandrea.com/articles/parse-json-dart/
 +
 +
==== Weitere Libraries für Behandlung von JSON in Dart/Flutter ====
 +
Weitere hilfreiche Libraries mit JSON
 +
* [https://pub.dev/packages/json_path json_path]
 +
* [https://pub.dev/packages/rfc_6901 rfc_6901 - JSONPointer Implementierung] - kann JSON-Strukturen bearbeiten
 +
* [https://pub.dev/packages/flutter_json_view flutter_json_view] - kann JSON-Strukturen anzeigen
 +
 +
== Libraries ==
 +
 +
=== AppState-Libraries ===
 +
 +
Sehr einfache AppState-Libraries sind
 +
 +
*  get_it und
 +
*  watch_it
 +
 +
=== UI-Libraries ===
 +
 +
* https://forui.dev/docs
 +
* https://flutter-shadcn-ui.mariuti.com/
 +
 +
=== Datenbank ===
 +
 +
==== SurrealDB ====
 +
 +
[[SurrealDB]] kann mit dem Package [https://github.com/duhanbalci/surrealdb_flutter surrealdb von Duhanbalci] genutzt werden.
 +
 +
===== Problem mit Websocket-Subprotokoll =====
 +
Stand Jan. 2025 gibt es noch ein Problem mit einem "Subprotokoll" der Websocket-Schnittstelle. Näheres dazu unter dem [https://github.com/duhanbalci/surrealdb_flutter/issues/26 (allerdings geschlossenen) Issue auf GitHub].
 +
 +
==== CouchDB ====
 +
 +
* Couchbase Lite
 +
** [https://pub.dev/packages/cbl_flutter cbl_dart] - alle Plattformen außer Web
 +
** [https://pub.dev/packages/cbl_flutter cbl_flutter] nur für Android
 +
 +
 +
* [https://pub.dev/documentation/wilt/latest/wilt/Wilt-class.html Wilt] - CouchDB client for server and flutter-based mobile
 +
* [https://pub.dev/packages/sporran Sporran] basiert auf Wilt, kann aber auch lokal arbeiten und wie [[PouchDB]] mit einer entfernten Instanz synchronisieren. Wohl nur für Web-Plattform.
 +
 +
==== Weitere Datenbanken ====
 +
 +
* [[Sembast]]
 +
* sqflite - SQLLite für Flutter
 +
* Floor - basiert auf sqflite
 +
** https://quashbugs.com/blog/exploring-flutters-floor-library-for-efficient-data-persistence
 +
* Hive
 +
 +
 +
=== Offline-First ===
 +
 +
Insbesondere mobile Apps müssen damit zurechtkommen, dass Datenänderungen nicht sofort zum zentralen Server oder zum Client kommen. Auch dafür gibt
 +
es Libraries, die helfen, wenn die Datenbank das nicht selbst tut (z.B. bei [[PouchDB]]):
 +
 +
* [ https://pub.dev/packages/fast_sync_hive_dao FastSync]
 +
** https://pub.dev/packages/fast_sync_client
 +
* https://code.zeba.academy/offline-apps-flutter-syncing-data-handling-connectivity-issues/ - Anleitung mit Hilfe der lokalen Datenbank [[Sembast]]
 +
* https://www.powersync.com/blog/flutter-tutorial-building-an-offline-first-chat-app-with-supabase-and-powersync - Anleitung mit Hilfe von SQLite, Supabase und PowerSync
 +
* https://flutterdata.dev/
 +
** https://github.com/flutterdata/flutter_data
  
 
== Weiterführendes ==
 
== Weiterführendes ==

Aktuelle Version vom 17. Januar 2025, 16:09 Uhr


Als Programmiersprache wird Dart genutzt. Die Benutzerelemente sehen zwar aus wie native Elemente; sie werden aber auf Pixelbasis von den Flutter-Komponenten selbst errechnet.

Projektstruktur

Zur grundsätzlichen Struktur eines Dart-Projekts (package) siehe

Ein Package umfasst ein oder mehrere Libraries. Eine Library ist üblicherweise ein Dart-File (Ausnahme: Einbindung anderern [generierter] Dateien mittels part-Direktive). Libraries im lib/-Verzeichnis sind public, wogegen solche im lib/src-Verzeichnis privat sind.

Wenn man Flutter benutzt kann man die Struktur durch

 flutter create

erzeugen lassen.

Programmierparadigmen

State Management

Das State Management ist ähnlich demjenigen von React und React Native, allerdings klassenbasiert. Die neueren funktionsbasierten Hooks (useXXX) aus der React-Welt gibt es in Flutter nicht. Dafür gibt es viele ähnliche App-State-Management-Libraries, teilweise Übertragungen aus der React-Welt wie Redux und MobX.

Das State-Management erfolgt (ohne Library-Ergänzung) mit

  • StatefulWidget oder
  • InheritedWidget.

Man kann sich für eine App drei Schichten vorstellen:

  • UI (möglichst keine Logik, keine veränderbaren Daten)
  • App State-Management (nur Logik und Daten)
  • Business Logic (nur Logik und Daten, Persistenz, Netzwerk-Zugriff ...)

Siehe auch

immutable state

Benütze so oft als möglich "final"!

Besonderheiten

Dateizugriff auf Media-Dateien beschränkt

Beim Auflisten des Inhalts eines Verzeichnisses erscheinen Dateien nicht. Das liegt daran, dass standardmäßig unter Android keine Berechtigungen erlaubt sind, andere Dateien als Media-Dateien (JPEG, PDF etc) zu lesen.

Man muss die Berechtigungen sowohl in die Manifest.xml eintragen als auch vom Benutzer anfordern. Siehe Permission.request in plugin permission_handler. In Frage kommen insbesondere:

  • READ_MEDIA_IMAGES
  • READ_MEDIA_VIDEO
  • READ_MEDIA_AUDIO

oder

Siehe

JSON

JSON serialization

Dart hilft beim Einpacken von Daten in JSON und dem Auspacken. Allerdings ist es nicht JavaScript oder TypeScript, das ein first-class-Handling von JSON ermöglichen.

Hilfreiche Libraries sind

  • json_serializable
  • built_value
  • deep_pick
  • equatable

Siehe auch

Weitere Libraries für Behandlung von JSON in Dart/Flutter

Weitere hilfreiche Libraries mit JSON

Libraries

AppState-Libraries

Sehr einfache AppState-Libraries sind

  • get_it und
  • watch_it

UI-Libraries

Datenbank

SurrealDB

SurrealDB kann mit dem Package surrealdb von Duhanbalci genutzt werden.

Problem mit Websocket-Subprotokoll

Stand Jan. 2025 gibt es noch ein Problem mit einem "Subprotokoll" der Websocket-Schnittstelle. Näheres dazu unter dem (allerdings geschlossenen) Issue auf GitHub.

CouchDB


  • Wilt - CouchDB client for server and flutter-based mobile
  • Sporran basiert auf Wilt, kann aber auch lokal arbeiten und wie PouchDB mit einer entfernten Instanz synchronisieren. Wohl nur für Web-Plattform.

Weitere Datenbanken


Offline-First

Insbesondere mobile Apps müssen damit zurechtkommen, dass Datenänderungen nicht sofort zum zentralen Server oder zum Client kommen. Auch dafür gibt es Libraries, die helfen, wenn die Datenbank das nicht selbst tut (z.B. bei PouchDB):

Weiterführendes

Siehe