Flattern - Ist es möglich, Daten zu extrahieren, aus einer Zukunft ohne die Verwendung eines FutureBuilder?
Bin ich beim Lesen im user-provided input (in diesem Fall ein zip-code) aus einem TextField
dass ich brauchen, um zu überprüfen, anhand einer Datenbank auf Gültigkeit. Allerdings brauche ich, um eine asynchrone Datenbank-Abfrage in der submit-button (ein RaisedButton
in diesem Fall) onPressed: () {}
lambda-Funktion. In den meisten Programmiersprachen, dies ist eine ziemlich einfache und einfache Aufgabe. Das problem ich bin in ein Flattern, jedoch, ist die Tatsache, dass Future
zurückgegebenen Objekte aus asynchrone Datenbank-Abfragen können nur verwendet werden FutureBuilder
Objekte, die wiederum nur zurück Widget
Objekte. Ich brauche einfach ein String
zurückgegeben, die ich dann nutzen kann, um entweder pass, um eine neue route über einen MaterialPageRoute
Objekt, oder das display einen Fehler an den Benutzer ohne änderung der Routen. Gibt es eine Möglichkeit, dies zu tun mit Flattern? Rückkehr ein Widget ist für mich nutzlos, da ich nicht wollen, erstellen Sie ein neues Widget für die Anzeige. Ich bin mit Flattern 0.3.2 und Dart 2.0.0
Als ein Vereinfachtes Beispiel, wo muss ich anrufen die Datenbank-Abfrage:
@override
Widget build(Buildcontext context) {
return new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Container(
padding: const EdgeInsets.all(16.0),
child: new TextField(
keyboardType: TextInputType.number,
controller: _controller,
decoration: new InputDecoration(
hintText: 'Zip Code',
),
onSubmitted: (string) {
return string;
},
),
),
new RaisedButton(
onPressed: () {
//use regex to test against user input
if (_controller.text != null && _controller.text.isNotEmpty) {
RegExp zipCodeRegExp = new RegExp(r"^(\d{5})$");
//if the user input validates...
if (zipCodeRegExp.hasMatch(_controller.text)) {
zipCode = _controller.text;
//need to perform database query here and return a string, not a Widget
} else {
//an else condition here
}
} else {
//an else condition here
}
}
}
),
],
);
}
Vielleicht bin ich nicht nach dem "mantra" Flattern? Ich Schätze Ihre Aufmerksamkeit und Eingabe auf diesem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
FutureBuilder
ist nur ein praktischer Helfer, um die widget-Baum neu erstellt, wenn Sie eine Zukunft schließt.Können Sie
oder
Die wichtigste Einschränkung ist, dass Sie nicht mehr zurück können, wird der Wert direkt an den Aufrufer ohne
Future
, da es keine Möglichkeit gibt, um wieder von der asynchronen Ausführung zu synchronisieren Ausführung.Hab ich da dachte, dieses heraus (ich glaube, das ist das, was Günter war ursprünglich sagen, aber der Grund war nicht klar, für mich damals). Der einzige Weg, um in der Lage sein, zu konsumieren, ein
Future
ohne eineWidget
Objekt ist durch die Verwendung derFuture
API. DieFuture
API ermöglicht die Analyse einesFuture
Objekt, als ob es war einAsyncSnapshot
- Objekt (das ist, wo würde man analysieren.data
imFutureBuilder
builder:
- Funktion). Dies kann durchgeführt werden zurückgegebenFuture
Objekt (das könnenasync
mitawait
). Zum Beispiel:Dies ist ziemlich einfach, wenn Sie verstehen, wie die
Future
API genutzt werden können, und es ist Absicht vs. mitFutureBuilder
. Gut zu wissen für Anfänger dieser Sprache wie ich!Einen
Future
ist nur semantischen Zucker für einen Rückruf. Stellen Sie sich vor Sie hatte:Gibt es nicht einen Weg, um konvertieren (oder Extrakt)
name
ausfetchName
. Es existiert nicht, bis der Rückruf beendet ist, und der Rückruf kann nicht sofort abgeschlossen werden (könnten auch aus einer Datenbank gelesen, wie dein Beispiel, oder das Netzwerk, etc).Einer der Vorteile der Verwendung von
FutureBuilder
ist es wirklich hilft, den Sinn des asynchronen Abstraktionen wieFuture
(undStreamBuilder
fürStream
), und lassen Sie Sie konzentrieren sich auf das schreiben von (synchron -) generator-code:return new FutureBuilder
), ist es nicht eigentlich der code ausgeführt. Ein test mit einer print () - Anweisung innerhalb der generator: () - Methode wird nie ausgeführt. Es ist, als wenn Sie müssen, dann konsumieren Sie das Widget-Objekt. Bin ich etwas fehlt (es gibt eine gute chance, die ich bin)?