Connect to App Services - Flutter SDK
On this page
The App
client is the interface to the Atlas App Services
backend. It provides access to App Services features like user authentication and Device Sync.
Before You Begin
Access the App Client
Changed in version 1.7.0: App
must be created on the main isolate.
Create an App
instance to access App Services features throughout your
client application. We recommend that you create the App
instance only
once on the main isolate, ideally as soon as the app starts.
Get your App Services App's ID from the App Services UI. To learn how, refer to Find your App ID.
Create an AppConfiguration object with your App's App ID as the argument.
Create an App with the
AppConfiguration
you just created. In Flutter v1.7.0 and later, this must be done on the main isolate, otherwise the SDK throws an error.
After you create the App
, you can access the constructed App
instance
on a background isolate using App.getById
. Refer to the
Get App by ID section on this page for more
information.
final appConfig = AppConfiguration(appId); final app = App(appConfig);
You can create multiple App client instances to connect to multiple Apps. All App client instances that share the same App ID use the same underlying connection.
Important
Changing an App Config After Initializing the App
Changed in version 1.8.0: baseUrl
is not cached in the AppConfiguration
When you initialize the App client, the configuration is cached internally. Attempting to close and then re-open an App with a changed configuration within the same process has no effect. The client continues to use the cached configuration.
In Flutter SDK version 1.8.0 and later, the baseUrl
is no longer cached in the App configuration. This means that you can change the
baseUrl
, and the App client will use the updated configuration. In
earlier SDK versions, changes to the baseUrl
in a cached App
configuration have no effect.
Advanced Configuration
Deprecated since version 1.6.0: App.localAppName
and App.localAppVersion
are no longer used.
You can add optional arguments to the AppConfiguration
for more granular control
of your App
client. You may want to add things like custom timeouts
for connections or keys for local metadata encryption.
To learn about the available configuration options, refer to the
AppConfiguration reference documentation.
final appConfig = AppConfiguration(appId, defaultRequestTimeout: const Duration(seconds: 120) // ... see reference docs for all available configuration options );
Note
Connect Using Android 7 or Older
The default HTTP client included with the Realm Flutter SDK does not work
for apps running on Android 7 or older. To work around this, you must add
a custom HTTP client to your AppConfiguration
. To learn more,
refer to Connect to App Services Using Android 7 or Older.
Get App by ID
New in version 1.7.0.
After you have created an App
instance on the main isolate, you can access
the constructed instance on a background isolate by passing the App ID to the
App.getById() method. Then, you can use it to work with the App
and users as needed.
// Create an App instance once on main isolate, // ideally as soon as the app starts final appConfig = AppConfiguration(appId); final app = App(appConfig); final receivePort = ReceivePort(); // Later, access the App instance on background isolate await Isolate.spawn((List<Object> args) async { final sendPort = args[0] as SendPort; final appId = args[1] as String; try { final backgroundApp = App.getById(appId); // ... Access App users final user = backgroundApp?.currentUser!; // Use the App and user as needed. sendPort.send('Background task completed'); } catch (e) { sendPort.send('Error: $e'); } }, [receivePort.sendPort, appId]);
Connect to a Specific Server
By default, Atlas Device SDK connects to Atlas using the global baseUrl
of https://services.cloud.mongodb.com
. In some cases, you may want to
connect to a different server:
Your App Services App uses local deployment, and you want to connect directly to a local
baseUrl
in your region.
For more information, refer to the Local Deployment App Services documentation.
You can specify a baseUrl
in the
AppConfiguration:
// Specify a baseUrl to connect to a server other than the default final appConfig = AppConfiguration(appId, baseUrl: Uri.parse('https://example.com')); var app = App(appConfig);
Connect to a Different Server During Runtime
New in version 1.8.0.
Changed in version 2.2.0: updateBaseUrl
accepts null
value
In some cases, you might want to change the baseUrl
while the app is
running.
To change the baseUrl
during runtime, call the experimental
app.updateBaseUrl method. You can
pass null
to reset the baseUrl
to the default value.
// Specify a custom baseUrl to connect to. // In this case, a custom server instance running on the device. final appConfig = AppConfiguration(customServerAppId, baseUrl: Uri.parse('http://localhost:80')); var app = App(appConfig); // ... log in a user and use the app ... // Later, change the baseUrl to the default: // https://services.cloud.mongodb.com await app.updateBaseUrl(null);
This API is experimental and may change in future releases.
If you want to change the baseUrl
after you have logged in a user and
have opened a synced database, the app must perform a client reset. For more
information, refer to Client Reset.
Perform the following in your code:
Update the
baseUrl
using theapp.updateBaseUrl
methodRe-authenticate the user to log in using the new
baseUrl
Open a synced database pulling data from the new server
Both the server and the client must be online for the user to authenticate and connect to the new server. If the server is not online or the client does not have a network connection, the user cannot authenticate and open the database.