2017-07-18 4 views
0

arbeitete ich durch einige Code, und bemerkte:Uri-Klasse gibt Fehler aus, wenn queryParameters einen Schlüssel mit einem Wert enthält: false?

return new Uri(host: server, path: apiPath, query: query, queryParameters: queryParams); 

Dieser Code regelmäßig über die Anwendung ausgeführt wird, und der einzige Unterschied war queryParams. So druckte ich es aus:

{Id:[1234], enabled:false} 

zeigt es ist, einen Schlüssel: Wert von: ID: List, aktiviert: boolean.

Der Stack-Trace i erhalten ist: enter image description here

, die die Karte zeigt und dann die Spur. # 6 zeigt auf die obige Zeile.

Es ist falsch schauen ... etwas mit iterieren falsch ist das, was das bricht.

Antwort

1

Wenn Sie mit den URI- und Abfrageparametern arbeiten, sucht sie nach Zahlen, Listen und Strings, aber nicht nach Booleschen Werten. Um dies zu lösen und lassen Sie es richtig funktioniert, müssen Sie tun:

{"enabled": false.toString()} 
// or 
{"enabled": "false"} 

und die uri Klasse wird die Abfrageparameter entsprechend eingestellt.

Die Uri-Klasse befindet sich in der Core-Bibliothek für Dart. Wenn wir es verwenden, passieren wir in der Uri erstellte Objekt in eine Aktion für eine Client-Klasse,

Client client = new BrowserClient(); 

, die die URL als Teil der Parameter akzeptiert.

Bei Betrachtung der oben genannten Fehler kann die Uri-Klasse einen falschen Wert jedoch nicht korrekt auf einen akzeptierten Wert analysieren.

Wenn im Kodex Docs für Uri Suche nach den Dart Sprachen: https://api.dartlang.org/dev/1.25.0-dev.7.0/dart-core/Uri/Uri.html

Die Abfragekomponente wird entweder durch Abfrage oder Query eingestellt. Wenn eine Abfrage verwendet wird, sollte die angegebene Zeichenfolge eine gültige URI-Abfrage sein, aber ungültige Zeichen außer allgemeinen Begrenzern werden bei Bedarf mit Escapezeichen versehen. Wenn queryParameters verwendet wird, wird die Abfrage aus der bereitgestellten Map erstellt. Jeder Schlüssel und Wert in der Karte wird in Prozent codiert und mit gleichen und kaufmännischen Zeichen verknüpft. Ein Wert in der Map muss entweder ein String oder ein Iterable von Strings sein, wobei letzteres mehreren Werten für denselben Schlüssel entspricht.

Es ist sinnvoll zu sagen, dass alle Werte String oder Iterable of Strings sein müssen. Das einzige, was ich nicht herausbekommen kann, ist, dass in Dartpad true und false toString-Funktionen haben, und doch kann man dort auch Zahlen eingeben.

Die einzige Schlussfolgerung ist, dass, während es Strings und Iterables von Strings akzeptiert, es auch Ints und andere Zahlen analysieren wird, weil sie explizit für diesen Typ überprüfen werden, wie es in URI zu sehen ist.

Man könnte denken, dass die URI boolesche Werte verstehen würde, da diese ebenfalls gebräuchlich sind, aber das ist noch zu sehen, da ich den Quellcode für dartlang nicht explizit betrachten kann. Ich habe es jedoch geschafft, den Quellcode dafür zu betrachten und einzugrenzen. writeComponent zeigt auf _Uri._uriEncode, aber wenn man sich diese Funktion anschaut, gibt es keinen Code so viel wie nur eine Definition.

HTH.

Verwandte Themen