Fix localhost invalid domain in Flutter 1.22
1 min read

Fix localhost invalid domain in Flutter 1.22

Recently, I update Flutter to version 1.22 and one of my apps stopped working on iOS, giving the following error:

Runner[52852:484760] [VERBOSE-2:shell.cc(210)] Dart Unhandled Exception: Invalid argument (domain): Invalid domain name: "localhost", stack trace: #0      new _DomainNetworkPolicy (dart:io/network_policy.dart:85:7)
#1      _constructDomainPolicies (dart:io/network_policy.dart:181:22)
#2      _EmbedderConfig._setDomainPolicies (dart:io/embedder_config.dart:44:23)

It looks like a change in the network policy does not allow to defined localhost as a valid domain.

I am currently using localhost to connect to a local Cloud Functions emulator, by instantiating Cloud Functions with

CloudFunctions(region: region)
    .useFunctionsEmulator(origin: "http://localhost:5001")

and allowing http connection in the Info.plist:

...
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>
...

Apparently this was broken with Flutter 1.22.

My solution was to remove the exception from the Info.plist file, by removing the lines above, and then adding a host to the firebase.json of the local Firebase project, where the emulators are defined:

...
"emulators": {
    "functions": {
        "port": 5001,
        "host": "0.0.0.0" <-- added this
    },
...

This led to an update of instantiation of Cloud Functions in code:

CloudFunctions(region: region)
    .useFunctionsEmulator(origin: ""http://0.0.0.0:5001")

and everything started working again.

There is another change in Flutter 1.23 that might break this again. I will update this short article if needed.

Subscribe to a curated newsletter

Receive an email every week with curated content about Dart and Flutter.

See previous issues of the newsletter.