Bearbeiten von „Dart“

Zur Navigation springen Zur Suche springen

Warnung: Du bist nicht angemeldet. Deine IP-Adresse wird bei Bearbeitungen öffentlich sichtbar. Melde dich an oder erstelle ein Benutzerkonto, damit Bearbeitungen deinem Benutzernamen zugeordnet werden.

Die Bearbeitung kann rückgängig gemacht werden. Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und veröffentliche dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.

Aktuelle Version Dein Text
Zeile 5: Zeile 5:
* https://codingwithjoe.com/dart-fundamentals-async-await
* https://codingwithjoe.com/dart-fundamentals-async-await
* https://dartpad.dev
* https://dartpad.dev
* [[ArgParser Dart]]


= Statements =
= Statements =
<syntaxhighlight lang=dart>for (var ix in list) { print(ix); }
<source lang=dart>for (var ix in list) { print(ix); }
for (var entry in list.entries) { print(entry.key + entry.value); }
for (var entry in list.entries) { print(entry.key + entry.value); }
for (int ix = 0; ix < 10; ix++) {}
for (int ix = 0; ix < 10; ix++) {}
Zeile 21: Zeile 20:
}
}
assert(str.isEmpty(), "String muss leer sein"); // nur im Debug aktiv.
assert(str.isEmpty(), "String muss leer sein"); // nur im Debug aktiv.
</syntaxhighlight>
</source>
== Exception ==
== Exception ==
<syntaxhighlight lang=dart>
<source lang=dart>
try {
try {
   breedMoreLlamas();
   breedMoreLlamas();
Zeile 41: Zeile 40:
   MyException(this.message);
   MyException(this.message);
}
}
</syntaxhighlight>
</source>


= Class =
= Class =
<syntaxhighlight lang=dart>abstract class BaseLogger {
<source lang=dart>abstract class BaseLogger {
   int _errors = 0;
   int _errors = 0;
   int _level;
   int _level;
Zeile 69: Zeile 68:
   const logger2 = BaseLogger.lastInstance();
   const logger2 = BaseLogger.lastInstance();
   var isSilent = logger.isSilent;
   var isSilent = logger.isSilent;
</syntaxhighlight>
</source>
 
== Named constructors ==
<syntaxhighlight lang=dart>
class Point {
  final double x;
  final double y;
  Point(this.x, this.y);
  // Named constructor
  Point.origin()
      : x = xOrigin,
        y = yOrigin;
}
</syntaxhighlight>
 
=== Mixins ===
Mixins sind Klassen, die ihre Eigenschaften an andere Klassen ausleihen, aber nicht in die Klassenhierarchie
eingebunden sind.
 
In anderen Sprachen wird das als Trait bezeichnet.
<syntaxhighlight lang=dart>
abstract class ErrorHandler {
  final lastError = '';
  // This class is intended to be used as a mixin, and should not be extended directly.
  factory ErrorHandler._() => null;
 
  void setError(String msg) => lastError = msg;
  void print() => print('+++ $lastError');
}
class DoIt with ErrorHandler{
  ...
  bool validate(String s){
    if (s.isEmpty()){
      setError('input is empty');
    }
  }
...
}
// Mehrere Mixins:
class A extends B with Errorhandler, MyMixin {
}
</syntaxhighlight>


=== Enum ===
=== Enum ===
<syntaxhighlight lang=dart>enum DataType { bool, int, string, customType } // Schlüsselwörter erlaubt!
<source lang=dart>enum DataType { bool, int, string, customType } // Schlüsselwörter erlaubt!
DataType.values.forEach((v) => print('value: $v, index: ${v.index}'));
DataType.values.forEach((v) => print('value: $v, index: ${v.index}'));
</syntaxhighlight>
</source>


== Interface ==
== Interface ==
* Jede Klasse kann Interface sein. Dann muss jede Methode überschrieben werden
* Jede Klasse kann Interface sein. Dann muss jede Methode überschrieben werden
<syntaxhighlight lang=dart>
<source lang=dart>
class D implements A, B, C {
class D implements A, B, C {
   @override
   @override
Zeile 126: Zeile 84:
   }
   }
}
}
</syntaxhighlight>
</source>


== Generator ==
== Generator ==
<syntaxhighlight lang=dart>Iterable<int> naturalsTo(int n) sync* {
<source lang=dart>Iterable<int> naturalsTo(int n) sync* {
   int k = 0;
   int k = 0;
   while (k < n) yield k++;
   while (k < n) yield k++;
}
}
</syntaxhighlight>
</source>
* ... und mit Rekursion:
* ... und mit Rekursion:
<syntaxhighlight lang=dart>Iterable<int> naturalsDownFrom(int n) sync* {
<source lang=dart>Iterable<int> naturalsDownFrom(int n) sync* {
   if (n > 0) {
   if (n > 0) {
     yield n;
     yield n;
Zeile 141: Zeile 99:
   }
   }
}
}
</syntaxhighlight>
</source>


= Typen =
= Typen =
* Casting:
* Casting:
<syntaxhighlight lang=dart>
<source lang=dart>
final x = y as String;
final x = y as String;
</syntaxhighlight>
</source>
== typedef ==
== typedef ==
Definiert eine Methodensignatur oder einen Typ-Alias:
Definiert eine Methodensignatur oder einen Typ-Alias:
<syntaxhighlight lang=dart>
<source lang=dart>
typedef IntList = List<int>;
typedef IntList = List<int>;
typedef Compare<T> = int Function(T a, T b);
typedef Compare<T> = int Function(T a, T b);
Zeile 158: Zeile 116:
   if (validator(input)) doIt();
   if (validator(input)) doIt();
}
}
</syntaxhighlight>
</source>


== Map ==
== Map ==
<syntaxhighlight lang=dart>final map = <String, int>{ 'John': 1, 'Eve': 2 };
<source lang=dart>final map = <String, int>{ 'John': 1, 'Eve': 2 };
final knowsEve = map.containsKey('Eve') && map.containsValue(2);
final knowsEve = map.containsKey('Eve') && map.containsValue(2);
map.remove('John');
map.remove('John');
Zeile 168: Zeile 126:
map.forEach((k, v) { print('{ key: $k, value: $v }'); });
map.forEach((k, v) { print('{ key: $k, value: $v }'); });
map.entries.forEach((e) {  print('{ key: ${e.key}, value: ${e.value} }'); });
map.entries.forEach((e) {  print('{ key: ${e.key}, value: ${e.value} }'); });
</syntaxhighlight>
</source>


== List ==
== List ==
* Indizes: start: inklusiv end: exklusiv
* Indizes: start: inklusiv end: exklusiv
<syntaxhighlight lang=dart>final names = <String>['adam', 'bob', 'charly', 'eve'];
<source lang=dart>final names = <String>['adam', 'bob', 'charly', 'eve'];
final names2 = [...names, 'judy'];
names.add('fred'); names.insert(3, 'chris');
names.add('fred'); names.insert(3, 'chris');
ix = names.indexOf('bob'); ix2 = names.indexWhere((item) => item.startsWith('b'), start);
ix = names.indexOf('bob'); ix2 = names.indexWhere((item) => item.startsWith('b'), start);
Zeile 186: Zeile 143:
names.followedBy(name2); // liefert names und die Iterables name2
names.followedBy(name2); // liefert names und die Iterables name2
names.any((item) => item.length < 3); // irgend ein Element mit der Bedingung
names.any((item) => item.length < 3); // irgend ein Element mit der Bedingung
allLowerThan3 = names.every((item) => item.length < 3); // alle Elemente entsprechen der Bedingung
names.every((item) => item.length < 3); // alle Elemente mit der Bedingung
subList = names.where((item) => item[0] > 'k');
firstNameWithLength3 = names.firstWhere((item) => item.length==3, orElse: () => '<None>');
final summary = names.fold('names:', (prevValue, item) => prevValue += ' ' + item);
final summary = names.fold('names:', (prevValue, item) => prevValue += ' ' + item);
// fold(), reduce(), shuffle(), removeWhere(),
// fold(), reduce(), shuffle(), removeWhere(),
// foreach(), join(), contains()
// foreach(), join(), contains()
</syntaxhighlight>
</source>


== DateTime ==
== DateTime ==
<syntaxhighlight lang=dart>
<source lang=dart>
// Für DateFormat
// Für DateFormat
import 'package:intl/intl.dart';
import 'package:intl/intl.dart';
Zeile 208: Zeile 163:


var linuxTime = now.millisecondsSinceEpoch ~/ 1000;
var linuxTime = now.millisecondsSinceEpoch ~/ 1000;
var date2 = DateTime.fromMillisecondsSinceEpoch(linuxTime * 1000);
 
test (date2.weekday == DateTime.monday /* 1 */ || date2.weekday == DateTime.sunday /* 7 */);
var formatter = DateFormat('yyyy.MM.dd HH:mm:ss dayOfWeek: E');
var formatter = DateFormat('yyyy.MM.dd HH:mm:ss dayOfWeek: E');
String formatted = formatter.format(now);
String formatted = formatter.format(now);
</syntaxhighlight>
</source>
 
== Set ==
<syntaxhighlight lang="dart">
var foundKeys = <String>{};
if (! foundKeys.contains('x')){
  foundKeys.add('x');
}
// Iterable unique machen:
words.split(' ').toSet().toList();
</syntaxhighlight>


== RegExpr ==
== RegExpr ==
<syntaxhighlight lang=dart>final regExpr = RegExp(r'(\w+)\s*=\s*(\d+)');
<source lang=dart>final regExpr = RegExp(r'(\w+)\s*=\s*(\d+)');
      final matcher = regExpr.firstMatch('abc = 123');
final matcher = reDisks.firstMatch(line);
 
if (matcher != null){
if (matcher != null){
   vars[matcher?.group(1)] = int.parse(matcher?.group(2) ?? 0);
   vars[matcher.group(1)] = int.parse(matcher.group(2));
}
}
</syntaxhighlight>
</source>


== String ==
== String ==
<syntaxhighlight lang=dart>
<source lang=dart>
const limit = 3;
const limit = 3;
var interpreted = "Limit: $limit Time: ${time()}";
var interpreted = "Limit: $limit Time: ${time()}";
const x = "abc" + interpreted;
</source>
</syntaxhighlight>
=== Konversion ===
=== Konversion ===
<syntaxhighlight lang=dart>final count = int.parse("123");
<source lang=dart>final count = int.parse("123");
</syntaxhighlight>
</source>


=== Formatierung ===
=== Formatierung ===
<syntaxhighlight lang=dart>import 'package:sprintf/sprintf.dart';
<source lang=dart>import 'package:sprintf/sprintf.dart';
sprintf("%02d %s", [1, "Hi"]);
sprintf("%02d %s", [1, "Hi"]);
print("${new DateTime.now().toString()}: $message\n");
print("${new DateTime.now().toString()}: $message\n");
</syntaxhighlight>
</source>
 
== Bytes ==
<syntaxhighlight lang=dart>
import 'dart:convert';
 
String foo = 'Hello world';
List<int> bytes = utf8.encode(foo);
String foo2 = utf8.decode(bytes);
</syntaxhighlight>


= Json =
= Json =
<syntaxhighlight lang=dart>class Photo {
<source lang=dart>class Photo {
   final int id;
   final int id;
   final String title;
   final String title;
Zeile 274: Zeile 207:
   }
   }
}
}
</syntaxhighlight>
</source>


= Besonderheiten =
= Besonderheiten =
* entweder optionale Positionsparameter oder optionale Namensparameter, nicht beide.
* entweder optionale Positionsparameter oder optionale Namensparameter, nicht beide.
<syntaxhighlight lang=dart>String substr(String str, int pos, [int length, bool uppercase]){ ... }
<source lang=dart>String substr(String str, int pos, [int length, bool uppercase]){ ... }
String substr2(String str, int pos, {int length, bool uppercase, Logger logger}){ ... }
String substr2(String str, int pos, {int length, bool uppercase, Logger logger}){ ... }
x = substr('Hi world', 3, 2);
x = substr('Hi world', 3, 2);
Zeile 288: Zeile 221:
x ~/ 5 // Ganzzahlige Division
x ~/ 5 // Ganzzahlige Division
logger?.log() // Aufruf von log nur, wenn logger!=null
logger?.log() // Aufruf von log nur, wenn logger!=null
</syntaxhighlight>
</source>


== Reflection, Runtime-Info ==
== Reflection, Runtime-Info ==
<syntaxhighlight lang=dart>if (a.runtimeType == int || a.runtimeType == String){...}
<source lang=dart>if (a.runtimeType == int || a.runtimeType == String){...}
if (a is String || or a is Map || a is! List){...}
if (a is String || or a is Map || a is! List){...}


</syntaxhighlight>
</source>


== UnitTest ==
== UnitTest ==
<syntaxhighlight lang=dart>import 'package:test/test.dart';
<source lang=dart>import 'import 'package:test/test.dart';
void main() {
void main() {
   group('Validators', () {
   group('Validators', () {
Zeile 308: Zeile 241:
     });
     });


</syntaxhighlight>
</source>
[https://dartdoc.takyam.com/articles/dart-unit-tests/#matchers Matcher]:
[https://dartdoc.takyam.com/articles/dart-unit-tests/#matchers Matcher]:
<pre>
 
isTrue
isTrue
equals(string)
equals(string)
Zeile 321: Zeile 254:
greaterThanOrEqualTo(v)
greaterThanOrEqualTo(v)
lessThan(v)
lessThan(v)
</pre>
== Async-Pattern ==
<syntaxhighlight lang=dart>
Future<bool> hasSubDirs(String path) async {
  var rc = false;
  final subdir = Directory(path);
  await for (var entry in subdir.list()){
    if (await Directory.isDirectory(entry.path)){
      rc = true;
      break;
    }
  }
  return rc;
}
</syntaxhighlight>

Bitte kopiere keine Webseiten, die nicht deine eigenen sind, benutze keine urheberrechtlich geschützten Werke ohne Erlaubnis des Urhebers!
Du gibst uns hiermit deine Zusage, dass du den Text selbst verfasst hast, dass der Text Allgemeingut (public domain) ist, oder dass der Urheber seine Zustimmung gegeben hat. Falls dieser Text bereits woanders veröffentlicht wurde, weise bitte auf der Diskussionsseite darauf hin. Bitte beachte, dass alle Info-Theke-Beiträge automatisch unter der „Gemeinfreiheit“ stehen (siehe Info-Theke:Urheberrechte für Einzelheiten). Falls du nicht möchtest, dass deine Arbeit hier von anderen verändert und verbreitet wird, dann klicke nicht auf „Seite speichern“.

Abbrechen Bearbeitungshilfe (wird in einem neuen Fenster geöffnet)