firstWhere
method takes a Predicate
. A Predicate
is just a function that takes in an object, and returns true
or false
. So basically it's saying "give me the first object from this list where the function I'm giving you returns true. The orElse
is an optional, named parameter that says, if you've gotten to the end of the list and not a single object returned true when passed through the function I just supplied, then execute this function as a last resort and return whatever value it produces. You can think of a Predicate
like a filter. It takes an object and returns true
if it should pass through the filter, or false
if it should not pass through the filter. firstWhere
basically goes through each element checking to see if it passes through the filter, and the first time something does, it returns that element. If nothing makes it through the filter, it uses the orElse
producer function to generate some value to return, since nothing made it through on it's own.
(f) => f.location == request
is a function that returns true or false based on it's argument - it's a Predicate
() => Feature()..location = request
is a Producer
. A function that has no argument, but produces a value. In this case, a value that is equal to a new Feature
with a location
value equal to request
. An assignment
evaluates to the value that was assigned. The cascade ..
ensures that the Feature
will be returned, instead of the Point
object, request
.
So basically you can think of it like this:
list.giveMeTheFirstObjectWhere(thisFunctionReturnsTrue, orElse: giveMeTheValueThisFunctionProvidesIfNoneOfTheElementsReturnedTrueUsingTheOtherFunction)
So the purpose of this code seems to be, checking if a Feature
already exists, and if it does, it returns the first such Feature
. If it doesn't exist, it creates a new Feature
and returns it (however, this newly created one isn't automatically added to the list/db)