Ich habe diese Idee eine ganze Weile mit mir herum getragen; Wenn ich ein neues Update für meine App veröffentliche, will ich meinen Benutzern mit einem schicken Dialog mitteilen, was es Neues gibt.
Außerdem bekomme ich wiederholt Nachfragen zu grundlegenden Funktionalitäten, die sich gut in einem Tutorial machen würden. Schließlich will ich meine App auch nicht mit Infotexten zukleistern.

Das Problem

Für Erstbenutzer will ich ein kurzes Tutorial anzeigen, in dem die etwas versteckten Funktionalitäten vorgestellt werden (Wischgesten sind offenbar noch immer nicht intuitiv). Das soll Frustration und häufige Nachfragen verhindern.
Entsprechend soll beim ersten Öffnen der App eine Serie von Dialogen angezeigt werden, um diese Funktionen zu erklären. Aber auch nur beim ersten Öffnen.

Zusätzlich möchte ich einen Dialog anzeigen, der die zugefügten Datensätze oder Funktionalitäten eines neuen Updates anzeigt. Diese Informationen stehen zwar auch in den App-Store-Einträgen, aber die werden nicht sonderlich häufig gelesen.

Die Lehrbuch-Lösung

Ich brauchte Stackoverflow um auf die richtige Idee zu kommen. Einfacher als gedacht.

Kurz gesagt wird die Version der App abgespeichert und dann mit der aktuellen verglichen, sobald die App gestartet wird. Ein neuer Versionscode wird sich vom abgespeicherten unterscheiden und wenn noch keine Version gespeichert ist, dann haben wir einen neuen Nutzer vor uns und zeigen das Tutorial.

Das Programmieren

Dieser Code kommt in die main.dart, wo die App initial geladen und gebaut wird. Hier ist wichtig zu bedenken, dass die Preferences geladen sein müssen, bevor man sie abfragt. Anderenfalls bekommt man immer null zurück (und zeigt entsprechend das Tutorial an).

Je nach Aufbau der konkreten App muss dieser Schritt nicht unbedingt notwendig sein.

Preferences prefs;
PackageInfo packageInfo;

@override
 void initState() {
   super.initState();
   _loading();
 }

Future<void> _loading() async {
   try {
     await prefs.load();
     _checkVersion();
     return;
   } on Exception catch (e) {
      // TODO handle exception
   }
  
Future<void> _checkVersion() async {
   String savedVersion = prefs.getVersion();
   packageInfo = await PackageInfo.fromPlatform();
   String runningVersion = packageInfo.version;
   if (savedVersion == null) {
     _showTutorial();
   } else if (savedVersion != runningVersion) {
     _showUpdates();
   }
 }

Die Version muss in Preferences.dart abgespeichert werden. Wenn kein Wert gesetzt ist (initialer Zustand), dann soll null die Anzeige des Tutorials anstoßen.

  String version;

  /*
    returns null when no version is set yet
   */
  String getVersion() {
    return version; // returning null is a valid option
  }

  void setVersion(String newVersion) {
    version = newVersion;
    sharedPreferences.setString('version', newVersion);
  }

  void _load() async {
    sharedPreferences = await SharedPreferences.getInstance();
    version = sharedPreferences.getString('version');
  }

Die Versionscodes um die es hier geht kommen aus dem Projekt – abhängig von der Platform, für die gebaut wird.

Während des Debuggens ist der Eintrag version: 2.0.0+1 (oder so ähnlich) aus der pubspec.yaml relevant. Hier muss die Versionsnummer für den Test angepasst werden.

Die Versionsnummer wird für das eigentliche Release überschrieben. Für Android in local.properties.

flutter.buildMode=debug
flutter.versionName=2.0.0
flutter.sdk=/Library/flutter
sdk.dir=/Users/erdbaerchen/Library/Android/sdk
flutter.versionCode=1

Für iOS innerhalb von XCode, im General Reiter des Runners.

Für mich war zum Debugging das Anpassen der Versionsnummer in der pubspec.yaml stets die passende Option.

Das Ergebnis

Die Methoden _showTutorial() und _showUpdates() nutzen in meinem Fall showDialog() und zeigen einen Text an, den ich je nach Update anpasse.

Ich muss sagen, dass ich von diesem Feature so begeistert bin, dass ich es jetzt überall einbauen werde.

Meine Flutter-Fahrt – „Was gibt’s Neues“ Nachrichten

Beitragsnavigation


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert