An asynchronous function is one which doesn't complete its work immediately when it's called. That's why it returns a Future, which is an object which will eventually make the result available.
All functions must return something when they are called. Dart does not support blocking, where a function simply stops in the middle and lets other code run until it's ready to continue, because that requires having separate stacks, and it can't be efficiently compiled to JavaScript. So an asynchronous function must return something immediately, and that something is a future.
Returning the future allows the calling function to wait until the result is available. It has to, if it needs to use the result.
In your example, someFunct wants to return a list which isn't available until later. It cannot simply return a list immediately, because it doesn't have the list yet. So, it must return a Future<List<String>>.
The one case where you don't need to return a future from an otherwise asynchronous function is when the calling function doesn't care about the result, or it gets the result in some other way, say by it being added to a collection when it's ready. Then you can just return void, and not bother with a future.
In the vast majority of cases, your asynchronous functions must return a future, because they want to return something, and that's all they have available before the real result is ready.
someFunccannot return a value to its caller until aftersomeFuturehas completed. SincesomeFuncmust wait,someFunc's callers must wait too. Maybe you think thatsomeFunccould just block untilsomeFuturecompletes, but Dart is single-threaded in each isolate. IfsomeFuncblocked, thensomeFuturewould never be resolved. Maybe you think thatsomeFunccould block and allowsomeFutureto resolve by spinning its own event loop, but now you'd have nested event loops which are generally bad news (for example, they can lead to unexpected re-entrancy). - jamesdlin