Overview
CloudBase Flutter SDK enables you to use CloudBase capabilities in Flutter applications, including authentication, document database, data models, MySQL database, cloud functions, cloud hosting, APIs, and more. For usage, please refer to CloudBase Flutter SDK, or check the sample code.
CloudBase Flutter SDK is fully aligned with HTTP API
SDK is categorized by functionality:
- Authentication: API methods for user registration and login, supporting multiple login methods.
- Session Management: API methods for managing user session state and tokens.
- User Management: API methods for retrieving, updating, and managing user information.
- Identity Source Management: API methods for managing third-party identity source binding and unbinding.
- Password Management: API methods for password reset and change.
- Verification Management: API methods for verification code sending, verification, resending, CAPTCHA creation, verification, and management.
- Document Database: Operations for NoSQL document database including collections, documents, queries, updates, deletions, aggregation, transactions, and more.
- Data Model: Data model CRUD operations.
- Data Source Query: Query data source aggregation list, details, Schema, and table names.
- MySQL Database: MySQL RESTful database operations.
- Cloud Functions: Call cloud functions and function-type cloud hosting.
- Cloud Hosting: Call cloud hosting container services.
- APIs: Call APIs interfaces.
- Cloud Storage: File upload, download, delete, copy, move, and other operations.
Basic Usage Example
- Initialization
- Login Status Check
- User Registration Flow
- Password Login
- Logout
- Listen for State Changes
- Call Cloud Function
accessKey can be generated in CloudBase Platform/API Key Configuration
import 'package:cloudbase_flutter/cloudbase_flutter.dart';
// Initialize (async)
final app = await CloudBase.init(
env: 'your-env-id', // Replace with your environment ID
region: 'ap-shanghai', // Region, default is Shanghai
accessKey: 'your-key', // Fill in the generated Publishable Key
authConfig: AuthConfig(
detectSessionInUrl: true, // Optional: automatically detect OAuth parameters in URL
),
);
final auth = app.auth;
// Check login status
Future<bool> checkAuthStatus() async {
final result = await auth.getSession();
if (result.error != null) {
print('Failed to check login status: ${result.error!.message}');
return false;
}
if (result.data?.session != null) {
print('User is logged in: ${result.data!.user?.id}');
return true;
} else {
print('User is not logged in');
return false;
}
}
// User registration example (two-step verification flow)
Future<void> registerUser(String email, String password) async {
// Step 1: Send verification code
final signUpResult = await auth.signUp(SignUpReq(
email: email,
password: password,
));
if (signUpResult.error != null) {
print('Failed to send verification code: ${signUpResult.error!.message}');
return;
}
print('Verification code sent, waiting for user input...');
// Step 2: Verify verification code and complete registration
final verifyResult = await signUpResult.data!.verifyOtp!(
VerifyOtpParams(token: 'User input verification code'),
);
if (verifyResult.error != null) {
print('Registration failed: ${verifyResult.error!.message}');
} else {
print('Registration successful: ${verifyResult.data?.user?.id}');
}
}
// Password login example
Future<void> loginWithPassword(String email, String password) async {
final result = await auth.signInWithPassword(
SignInWithPasswordReq(email: email, password: password),
);
if (result.error != null) {
print('Login failed: ${result.error!.message}');
} else {
print('Login successful: ${result.data?.user?.id}');
print('Access Token: ${result.data?.session?.accessToken}');
}
}
// Logout example
Future<void> logout() async {
await auth.signOut();
print('Logged out');
}
// Listen for authentication state changes
final result = auth.onAuthStateChange((event, session, info) {
switch (event) {
case AuthStateChangeEvent.signedIn:
print('User signed in');
break;
case AuthStateChangeEvent.signedOut:
print('User signed out');
break;
case AuthStateChangeEvent.tokenRefreshed:
print('Token refreshed');
break;
case AuthStateChangeEvent.userUpdated:
print('User info updated');
break;
default:
break;
}
});
// Unsubscribe
result.data?.subscription.unsubscribe();
// Call cloud function example
final result = await app.callFunction(
name: 'myFunction',
data: {'key': 'value'},
);
if (result.isSuccess) {
print('Execution result: ${result.result}');
} else {
print('Execution failed: ${result.message}');
}
Authentication
signUp
Future<SignUpRes> auth.signUp(SignUpReq params)
Register a new user account using smart registration and login flow.
- Creates a new user account
- Uses smart registration and login flow: send verification code → wait for user input → smart judgment of user existence → auto login or register and login
- If user already exists, directly login; if user does not exist, register new user and auto login
Parameters
Response
Example
- Email Registration
- Phone Registration
- Error Handling
final result = await auth.signUp(SignUpReq(
email: 'user@example.com',
password: 'securePassword123',
nickname: 'New User',
));
if (result.error != null) {
print('Registration failed: ${result.error!.message}');
return;
}
// Verify verification code
final verifyResult = await result.data!.verifyOtp!(
VerifyOtpParams(token: '123456'),
);
if (verifyResult.isSuccess) {
print('Registration successful: ${verifyResult.data?.user?.id}');
}
final result = await auth.signUp(SignUpReq(
phone: '13800138000',
password: 'securePassword123',
));
if (result.error != null) {
print('Failed to send verification code: ${result.error!.message}');
return;
}
final verifyResult = await result.data!.verifyOtp!(
VerifyOtpParams(token: '123456'),
);
if (verifyResult.isSuccess) {
print('Registration successful: ${verifyResult.data?.user?.phone}');
}
final result = await auth.signUp(SignUpReq(
email: 'user@example.com',
password: 'password123',
));
if (result.error != null) {
final code = result.error!.code;
switch (code) {
case 'already_exists':
print('Email already registered');
break;
case 'password_too_weak':
print('Password too weak');
break;
case 'invalid_email':
print('Invalid email format');
break;
default:
print('Registration failed: ${result.error!.message}');
}
}
signInAnonymously
Future<SignInRes> auth.signInAnonymously({String? providerToken})
Anonymous login, creates a temporary anonymous user account.
- Creates a temporary anonymous user account
- No identity verification info needed
- Suitable for scenarios requiring temporary access
Parameters
Third-party platform token, used to associate third-party platform identity
Response
Example
- Anonymous Login
- Anonymous User Upgrade Flow
final result = await auth.signInAnonymously();
if (result.isSuccess) {
print('Anonymous login successful');
print('User ID: ${result.data?.user?.id}');
print('Is anonymous: ${result.data?.user?.isAnonymous}');
} else {
print('Anonymous login failed: ${result.error!.message}');
}
// Step 1: Anonymous login
final anonymousResult = await auth.signInAnonymously();
if (anonymousResult.error != null) {
print('Anonymous login failed: ${anonymousResult.error!.message}');
return;
}
print('Anonymous login successful, preparing to upgrade to official user');
// Step 2: Bind email (pass anonymousToken during registration)
final upgradeResult = await auth.signUp(SignUpReq(
email: 'user@example.com',
password: 'securePassword123',
anonymousToken: anonymousResult.data?.session?.accessToken,
));
if (upgradeResult.error != null) {
print('Upgrade failed: ${upgradeResult.error!.message}');
return;
}
// Step 3: Verify verification code
final verifyResult = await upgradeResult.data!.verifyOtp!(
VerifyOtpParams(token: '123456'),
);
if (verifyResult.isSuccess) {
print('Anonymous user upgrade successful');
}
signInWithPassword
Future<SignInRes> auth.signInWithPassword(SignInWithPasswordReq params)
Login with password. Supports login via username, email, or phone number.
Parameters
Response
Example
- Email Password Login
- Error Handling
final result = await auth.signInWithPassword(
SignInWithPasswordReq(
email: 'user@example.com',
password: 'securePassword123',
),
);
if (result.isSuccess) {
print('Login successful: ${result.data?.user?.id}');
} else {
print('Login failed: ${result.error!.message}');
}
final result = await auth.signInWithPassword(
SignInWithPasswordReq(
email: 'user@example.com',
password: 'wrongPassword',
),
);
if (result.error != null) {
switch (result.error!.code) {
case 'invalid_credentials':
print('Incorrect username or password');
break;
case 'user_not_found':
print('User does not exist');
break;
default:
print('Login failed: ${result.error!.message}');
}
}
signInWithOtp
Future<SignInWithOtpRes> auth.signInWithOtp(SignInWithOtpReq params)
Login with OTP (one-time verification code). After calling, a verification code will be sent. You need to complete verification through the returned verifyOtp callback.
- If the user does not exist, a user will be created by default. You can control whether to automatically create a user with the
shouldCreateUserparameter (default is true)
Parameters
Response
Example
- Example
final result = await auth.signInWithOtp(
SignInWithOtpReq(email: 'user@example.com'),
);
if (result.error != null) {
print('Failed to send verification code: ${result.error!.message}');
return;
}
// Call after user inputs verification code
final loginResult = await result.data!.verifyOtp!(
VerifyOtpParams(token: '123456'),
);
if (loginResult.isSuccess) {
print('OTP login successful: ${loginResult.data?.user?.id}');
}
signInWithOAuth
Future<SignInOAuthRes> auth.signInWithOAuth(SignInWithOAuthReq params)
Login with OAuth third-party platform. Returns authorization URL, you need to guide the user to redirect to this URL to complete authorization.
Parameters
Response
Example
- Example
final result = await auth.signInWithOAuth(
SignInWithOAuthReq(provider: 'wechat'),
);
if (result.isSuccess) {
final authUrl = result.data!.url!;
print('Please redirect to authorization page: $authUrl');
// Guide user to open authUrl for authorization
}
signInWithIdToken
Future<SignInRes> auth.signInWithIdToken(SignInWithIdTokenReq params)
Login with IdToken. Suitable for scenarios where third-party platform tokens have been obtained.
Parameters
Response
Example
- Example
final result = await auth.signInWithIdToken(
SignInWithIdTokenReq(
token: 'provider-id-token',
provider: 'wechat',
),
);
if (result.isSuccess) {
print('IdToken login successful: ${result.data?.user?.id}');
} else {
print('Login failed: ${result.error!.message}');
}
signInWithCustomTicket
Future<SignInRes> auth.signInWithCustomTicket(Future<String> Function() getTicketFn)
Login with custom ticket. By passing an async function to get the ticket, the server generates the ticket and completes the login.
Parameters
Async function to get custom login ticket
Response
Example
- Basic Usage
final result = await auth.signInWithCustomTicket(() async {
// Get custom ticket from your server
final ticket = await fetchTicketFromServer();
return ticket;
});
if (result.isSuccess) {
print('Custom ticket login successful: ${result.data?.user?.id}');
} else {
print('Login failed: ${result.error!.message}');
}
Session Management
getSession
Future<SignInRes> auth.getSession();
Get current session. If token has expired, it will be automatically refreshed.
Parameters
No parameters
Response
Example
- Example
final result = await auth.getSession();
if (result.isSuccess) {
final session = result.data?.session;
print('Access Token: ${session?.accessToken}');
print('User: ${result.data?.user?.id}');
} else {
print('Failed to get session: ${result.error!.message}');
}
refreshSession
Future<SignInRes> auth.refreshSession([String? refreshToken])
Refresh session. Use Refresh Token to get a new Access Token.
Parameters
Refresh token (optional, defaults to current session's refreshToken)
Response
Example
- Example
final result = await auth.refreshSession();
if (result.isSuccess) {
print('Session refreshed');
print('New Access Token: ${result.data?.session?.accessToken}');
} else {
print('Refresh failed: ${result.error!.message}');
}
setSession
Future<SignInRes> auth.setSession(SetSessionReq params)
Set session. Restore session state with Refresh Token.
Parameters
Response
Example
- Example
final result = await auth.setSession(
SetSessionReq(refreshToken: 'your-refresh-token'),
);
if (result.isSuccess) {
print('Session set successfully: ${result.data?.user?.id}');
}
signOut
Future<SignOutRes> auth.signOut([SignOutReq? params])
Logout. Clear local session and notify server to revoke token.
Parameters
Logout configuration options (optional)
Response
Example
- Example
await auth.signOut();
print("Logged out");
onAuthStateChange
OnAuthStateChangeResult auth.onAuthStateChange(OnAuthStateChangeCallback callback)
Listen for authentication state changes. Supports listening for login, logout, token refresh, and user update events.
Parameters
State change callback function
Response
Example
- Example
final result = auth.onAuthStateChange((event, session, info) {
print('Auth state changed: ${event.value}');
if (session != null) {
print('User: ${session.user?.id}');
}
});
// Stop listening
result.data?.subscription.unsubscribe();
getClaims
Future<GetClaimsRes> auth.getClaims();
Get JWT Claims of current Access Token (token claims).
Parameters
No parameters
Response
Example
- Example
final result = await auth.getClaims();
if (result.isSuccess) {
final claims = result.data?.claims;
print('User ID: ${claims?.sub}');
print('Email: ${claims?.email}');
print('User groups: ${claims?.groups}');
print('Expiration: ${claims?.exp}');
}
User Management
getUser
Future<GetUserRes> auth.getUser();
Get current logged-in user info.
Parameters
No parameters
Response
Example
- Example
final result = await auth.getUser();
if (result.isSuccess) {
final user = result.data?.user;
print('User ID: ${user?.id}');
print('Email: ${user?.email}');
print('Nickname: ${user?.userMetadata?.nickName}');
} else {
print('Failed to get user info: ${result.error!.message}');
}
refreshUser
Future<SignInRes> auth.refreshUser();
Refresh user info. Re-fetch the latest user data from server and update local session.
Parameters
No parameters
Response
Example
- Example
final result = await auth.refreshUser();
if (result.isSuccess) {
print('User info refreshed: ${result.data?.user?.id}');
}
updateUser
Future<UpdateUserRes> auth.updateUser(UpdateUserReq params)
Update user info. If updating email or phone number, verification code verification is required.
Parameters
Response
Example
- Update Basic Info
- Update Email (Requires Verification)
final result = await auth.updateUser(
UpdateUserReq(nickname: 'New Nickname', avatarUrl: 'https://example.com/avatar.png'),
);
if (result.isSuccess) {
print('User info updated: ${result.data?.user?.userMetadata?.nickName}');
}
final result = await auth.updateUser(
UpdateUserReq(email: 'new@example.com'),
);
if (result.isSuccess && result.data?.verifyOtp != null) {
final verifyResult = await result.data!.verifyOtp!(
UpdateUserVerifyParams(token: '123456'),
);
if (verifyResult.isSuccess) {
print('Email updated successfully: ${verifyResult.data?.user?.id}');
}
}
deleteUser
Future<CloudBaseResponse<void>> auth.deleteUser(DeleteUserReq params)
Delete current user. Password is required for security verification.
Parameters
Response
Example
- Example
final result = await auth.deleteUser(
DeleteUserReq(password: 'currentPassword'),
);
if (result.isSuccess) {
print('User deleted');
} else {
print('Deletion failed: ${result.error!.message}');
}
Identity Source Management
getUserIdentities
Future<GetUserIdentitiesRes> auth.getUserIdentities();
Get the list of identity sources bound to the current user.
Parameters
No parameters
Response
Example
- Example
final result = await auth.getUserIdentities();
if (result.isSuccess) {
for (final identity in result.data?.identities ?? []) {
print('Identity: ${identity.name} (${identity.provider})');
}
}
linkIdentity
Future<LinkIdentityRes> auth.linkIdentity(LinkIdentityReq params)
Bind third-party identity source. Will redirect to third-party authorization page to complete binding.
Parameters
Response
Example
- Example
final result = await auth.linkIdentity(
LinkIdentityReq(provider: 'wechat'),
);
if (result.isSuccess) {
print('Identity source bound successfully: ${result.data?.provider}');
}
unlinkIdentity
Future<CloudBaseResponse<void>> auth.unlinkIdentity(UnlinkIdentityReq params)
Unbind third-party identity source.
Parameters
Response
Example
- Example
final result = await auth.unlinkIdentity(
UnlinkIdentityReq(provider: 'wechat'),
);
if (result.isSuccess) {
print('Identity source unbound');
}
Password Management
resetPasswordForEmail
Future<ResetPasswordForEmailRes> auth.resetPasswordForEmail(String emailOrPhone, {String? redirectTo})
Reset password via email or phone number. After calling, a verification code will be sent. You need to complete password reset through the returned updateUser callback.
Parameters
Email or phone number
Redirect URL
Response
Example
- Example
final result = await auth.resetPasswordForEmail('user@example.com');
if (result.error != null) {
print('Failed to send verification code: ${result.error!.message}');
return;
}
// After user receives verification code
final resetResult = await result.data!.updateUser!(
UpdateUserAttributes(nonce: '123456', password: 'newPassword123'),
);
if (resetResult.isSuccess) {
print('Password reset successfully, auto-logged in');
}
resetPasswordForOld
Future<SignInRes> auth.resetPasswordForOld(ResetPasswordForOldReq params)
Reset password with old password.
Parameters
Response
Example
- Example
final result = await auth.resetPasswordForOld(
ResetPasswordForOldReq(
oldPassword: 'oldPassword123',
newPassword: 'newPassword456',
),
);
if (result.isSuccess) {
print('Password changed successfully');
} else {
print('Password change failed: ${result.error!.message}');
}
reauthenticate
Future<ReauthenticateRes> auth.reauthenticate();
Re-authenticate. Send verification code to user's email or phone number. After verification, sensitive operations can be performed (such as setting a new password).
Parameters
No parameters
Response
Example
- Example
final result = await auth.reauthenticate();
if (result.error != null) {
print('Failed to send verification code: ${result.error!.message}');
return;
}
final authResult = await result.data!.updateUser!(
UpdateUserAttributes(nonce: '123456', password: 'newSecurePassword'),
);
if (authResult.isSuccess) {
print('Re-authentication successful');
}
Verification Management
getVerification
Future<GetVerificationRes> auth.getVerification(GetVerificationReq params)
Send verification code. Supports sending to email or phone number.
Parameters
Response
Example
- Example
final result = await auth.getVerification(
GetVerificationReq(email: 'user@example.com'),
);
if (result.isSuccess) {
print('Verification code sent');
} else {
print('Failed to send: ${result.error!.message}');
}
verify
Future<VerifyRes> auth.verify(VerifyReq params)
Verify verification code (for email/phone verification).
Parameters
Response
Example
- Example
final result = await auth.verify(
VerifyReq(
email: 'user@example.com',
token: '123456',
),
);
if (result.isSuccess) {
print('Verification successful');
} else {
print('Verification failed: ${result.error!.message}');
}
verifyOAuth
Future<SignInRes> auth.verifyOAuth(VerifyOAuthReq params)
Verify OAuth callback. Handle the callback after user authorization on third-party platform.
Parameters
Response
Example
- Example
// Handle OAuth callback (typically in web platform)
final result = await auth.verifyOAuth(
VerifyOAuthReq(
code: 'auth-code-from-callback',
state: 'state-from-callback',
),
);
if (result.isSuccess) {
print('OAuth verification successful: ${result.data?.user?.id}');
}
verifyOtp
Future<SignInRes> auth.verifyOtp(VerifyOtpParams params)
Verify OTP (one-time password). Used to verify the verification code sent by signInWithOtp or signUp.
Parameters
Response
Example
- Example
final result = await auth.verifyOtp(
VerifyOtpParams(token: '123456'),
);
if (result.isSuccess) {
print('OTP verification successful: ${result.data?.user?.id}');
} else {
print('Verification failed: ${result.error!.message}');
}
resend
Future<ResendRes> auth.resend(ResendReq params)
Resend verification code.
Parameters
Response
Example
- Example
final result = await auth.resend(
ResendReq(email: 'user@example.com'),
);
if (result.isSuccess) {
print('Verification code resent');
} else {
print('Resend failed: ${result.error!.message}');
}
getCaptchaToken
Future<GetCaptchaTokenRes> auth.getCaptchaToken()
Get CAPTCHA token. Used to get CAPTCHA verification token before sending verification code.
Parameters
No parameters
Response
Example
- Example
final result = await auth.getCaptchaToken();
if (result.isSuccess) {
final captchaToken = result.data?.captchaToken;
print('CAPTCHA token: $captchaToken');
}
createCaptchaData
Future<CreateCaptchaDataRes> auth.createCaptchaData(CreateCaptchaDataReq params)
Create CAPTCHA verification data. Used to initialize CAPTCHA challenge.
Parameters
Response
Example
- Example
final result = await auth.createCaptchaData(
CreateCaptchaDataReq(captchaToken: 'captcha-token'),
);
if (result.isSuccess) {
print('CAPTCHA data created');
}
verifyCaptchaData
Future<VerifyCaptchaDataRes> auth.verifyCaptchaData(VerifyCaptchaDataReq params)
Verify CAPTCHA. Validate user's CAPTCHA response.
Parameters
Response
Example
- Example
final result = await auth.verifyCaptchaData(
VerifyCaptchaDataReq(
captchaToken: 'captcha-token',
captchaAnswer: 'user-answer',
),
);
if (result.isSuccess) {
print('CAPTCHA verified successfully');
} else {
print('CAPTCHA verification failed');
}
clearCaptchaToken
Future<ClearCaptchaTokenRes> auth.clearCaptchaToken()
Clear CAPTCHA token. Clean up CAPTCHA state after verification.
Parameters
No parameters
Response
Example
- Example
final result = await auth.clearCaptchaToken();
if (result.isSuccess) {
print('CAPTCHA token cleared');
}
Document Database
The document database (NoSQL) provides JS SDK-style chained calls, and you get an instance via app.database(). It supports create, read, update, and delete operations on collections and documents, complex conditional queries, aggregation, transactions, and more, and is fully aligned with the HTTP API.
- Initialize & Add
- Conditional Query
- Update & Delete
- Transaction
final app = await CloudBase.init(env: 'your-env-id');
final db = app.database();
// Add a single record
final addRes = await db.collection('todos').add({
'title': 'Learn CloudBase',
'completed': false,
'createdAt': DateTime.now(),
});
print('New document ID: ${addRes.id}');
final db = app.database();
final _ = db.command;
final res = await db
.collection('todos')
.where({'completed': false, 'priority': _.inList(['high', 'medium'])})
.orderBy('createdAt', OrderDirection.desc)
.limit(10)
.get();
print('Query results: ${res.data}');
final db = app.database();
final _ = db.command;
// Update a single document, increment a field
await db.collection('todos').doc('doc-id').update({'count': _.inc(1)});
// Delete a single document
await db.collection('todos').doc('doc-id').remove();
final db = app.database();
final _ = db.command;
final transaction = await db.startTransaction();
try {
await transaction.collection('accounts').doc('a').update({'balance': _.inc(-100)});
await transaction.collection('accounts').doc('b').update({'balance': _.inc(100)});
await transaction.commit();
} catch (e) {
await transaction.rollback();
}
database
CloudBaseDatabase app.database({String? instance, String? database})
Gets a document database instance. The optional parameters instance (instance ID) and database (database name) specify the database to access. Both can be omitted, in which case (default) is used (the default database of the default instance). You only need to pass them explicitly when accessing a non-default instance or database.
Parameters
Instance ID, defaults to (default)
Database name, defaults to (default)
Response
Database instance, providing capabilities such as collection, command, Geo, and startTransaction
Example
- Basic Initialization
- Specify Database Configuration
final db = app.database();
final db = app.database(instance: 'my-instance', database: 'my-db');
createCollection
Future<DbCreateCollectionResult> db.createCollection(String collName)
Creates a collection.
Parameters
Collection name
Response
Example
- Create Collection
final result = await db.createCollection('todos');
if (result.isSuccess) {
print('Collection created successfully');
}
collection
CollectionReference db.collection(String collName)
Gets a collection reference, on which you can chain query methods such as where, orderBy, limit, skip, and field, or call doc, add, get, count, and aggregate.
Parameters
Collection name
Response
Collection reference
Example
- Get Collection Reference
- Chained Calls
final collection = db.collection('todos');
final res = await db
.collection('todos')
.where({'completed': false})
.orderBy('createdAt', OrderDirection.desc)
.limit(10)
.get();
add
Future<DbAddResult> collection.add(dynamic data)
Adds records to a collection, supporting single (Map) and batch (List) additions.
Parameters
Document data. Pass a Map for a single addition, or a List for batch addition
Response
Example
- Single Addition
- Batch Addition
final res = await db.collection('todos').add({
'title': 'Learn CloudBase',
'completed': false,
'createdAt': DateTime.now(),
});
print('New document ID: ${res.id}');
final res = await db.collection('todos').add([
{'title': 'Task 1', 'completed': false},
{'title': 'Task 2', 'completed': true},
]);
print('New document ID list: ${res.ids}');
doc
DocumentReference collection.doc(dynamic docId)
Gets a document reference, on which you can call get, update, set, remove, and field.
Parameters
Document ID
Response
Document reference
Example
- Get Document Reference
final docRef = db.collection('todos').doc('doc-id');
final res = await docRef.get();
print(res.data);
where
Query collection.where(Map<String, dynamic> condition)
Sets query conditions, supporting equality matching and complex condition filtering via db.command operators.
Parameters
Query condition object, supporting equality matching, operator matching, nested field matching, and more
Response
Query object, on which you can chain methods such as orderBy, limit, skip, field, get, count, update, and remove
Example
- Basic Query
- Complex Conditional Query
final res = await db
.collection('todos')
.where({'completed': false, 'priority': 'high'})
.get();
print('Query results: ${res.data}');
final _ = db.command;
final res = await db
.collection('todos')
.where({
'age': _.gt(18),
'tags': _.inList(['tech', 'study']),
'createdAt': _.gte(DateTime.now().subtract(const Duration(days: 7))),
})
.orderBy('createdAt', OrderDirection.desc)
.limit(10)
.get();
print('Query results: ${res.data}');
orderBy
Query collection.orderBy(String field, OrderDirection direction)
Sets the sort rule. direction can be OrderDirection.asc or OrderDirection.desc. You can call it multiple times to combine multi-field sorting.
Parameters
Sort field
Sort direction: OrderDirection.asc (ascending) or OrderDirection.desc (descending)
Response
Query object, on which you can continue chaining
Example
- Example
final res = await db
.collection('todos')
.orderBy('createdAt', OrderDirection.desc)
.get();
limit
Query collection.limit(int max)
Sets the maximum number of records to return.
Parameters
Maximum number of records to return
Response
Query object, on which you can continue chaining
Example
- Example
final res = await db.collection('todos').limit(10).get();
skip
Query collection.skip(int offset)
Sets the number of records to skip, commonly used for pagination.
Parameters
Number of records to skip (offset)
Response
Query object, on which you can continue chaining
Example
- Pagination Query
const pageSize = 10;
const pageNum = 2;
final res = await db
.collection('todos')
.orderBy('createdAt', OrderDirection.desc)
.skip((pageNum - 1) * pageSize)
.limit(pageSize)
.get();
print('Page $pageNum data: ${res.data}');
print('Offset: ${res.offset}, page size: ${res.limit}');
field
Query collection.field(Map<String, dynamic> projection)
Specifies the fields to return in the query. true means return, and false means do not return. The document reference doc also supports the field method.
Parameters
Field projection, e.g. {'title': true, 'content': false}
Response
Query object, on which you can continue chaining
Example
- Example
final res = await db
.collection('todos')
.where({'completed': false})
.field({'title': true, 'completed': true, 'content': false})
.get();
get
Future<DbGetResult> collection.get()
Future<DbGetResult> query.get()
Future<DbGetResult> doc.get()
Gets query results. Called on a collection reference, it performs an unconditional query; called on a Query, it returns the list of matching documents; called on a document reference, it returns a single document (data is an empty list when the document does not exist).
Parameters
No parameters
Response
Example
- Query Collection
- Query Single Document
final res = await db.collection('todos').get();
print('${res.data.length} records in total');
final res = await db.collection('todos').doc('doc-id').get();
if (res.data.isNotEmpty) {
print('Document content: ${res.data.first}');
}
count
Future<DbCountResult> collection.count()
Future<DbCountResult> query.count()
Counts the number of documents matching the conditions.
Parameters
No parameters
Response
Example
- Example
final res = await db
.collection('todos')
.where({'completed': false})
.count();
print('Number of incomplete tasks: ${res.total}');
update
Future<DbUpdateResult> query.update(Map<String, dynamic> data)
Future<DbUpdateResult> doc.update(Map<String, dynamic> data, {bool returnDoc = false})
Updates documents. Called on a Query, it batch-updates documents matching the conditions; called on a document reference, it performs a merge update on a single document, and returns the updated document when returnDoc is true.
Parameters
Update data. You can use db.command update operators (such as _.inc, _.set, _.push, etc.)
Supported only by document reference update. When true, returns the updated document. Defaults to false
Response
Example
- Update Single Document
- Batch Update
final _ = db.command;
final res = await db
.collection('todos')
.doc('doc-id')
.update({'count': _.inc(1), 'completed': true}, returnDoc: true);
print('Updated document: ${res.doc}');
final res = await db
.collection('todos')
.where({'completed': false})
.update({'archived': true});
print('${res.updated} records updated');
set
Future<DbUpdateResult> doc.set(Map<String, dynamic> data)
Sets document data (full replacement; creates the document if it does not exist).
Parameters
Full document data, which will completely replace the original document
Response
Example
- Example
final res = await db.collection('todos').doc('doc-id').set({
'title': 'Reset task',
'completed': false,
});
remove
Future<DbRemoveResult> query.remove()
Future<DbRemoveResult> doc.remove()
Deletes documents. Called on a Query, it batch-deletes documents matching the conditions; called on a document reference, it deletes a single document.
Parameters
No parameters
Response
Example
- Delete Single Document
- Batch Delete
final res = await db.collection('todos').doc('doc-id').remove();
print('${res.deleted} records deleted');
final res = await db
.collection('todos')
.where({'completed': true})
.remove();
print('${res.deleted} records deleted');
command
DbCommand get db.command
Gets the query/update command (corresponding to the JS SDK's db.command, commonly abbreviated as _). It supports comparison, logical, field/array, update, geolocation, and other operators.
Parameters
No parameters
Response
Command object, used to build query conditions and update operations
Example
- Comparison & Logical Operators
- Field & Array Operators
- Update Operators
final _ = db.command;
// eq / neq / gt / gte / lt / lte / inList / nin
await db.collection('todos').where({'age': _.gte(18)}).get();
// and / or / not / nor
await db.collection('todos').where({
'priority': _.or([_.eq('high'), _.eq('medium')]),
}).get();
final _ = db.command;
// exists / mod / all / elemMatch / size
await db.collection('todos').where({
'tags': _.all(['tech', 'study']),
'assignee': _.exists(true),
}).get();
final _ = db.command;
// set / remove / inc / mul / min / max / rename / bit
await db.collection('todos').doc('doc-id').update({
'count': _.inc(1),
'weight': _.mul(2),
'deprecatedField': _.remove(),
});
// Array updates: push / pop / shift / unshift / pull / pullAll / addToSet
await db.collection('todos').doc('doc-id').update({
'tags': _.push('new tag'),
'members': _.addToSet('user-1'),
});
aggregate
Aggregate collection.aggregate()
Gets an aggregation operation object. Chain aggregation stages and then call end() to execute. Supports match, group, sort, project, limit, skip, unwind, lookup, addFields, count, sample, bucket, bucketAuto, geoNear, replaceRoot, sortByCount, and custom stage.
Parameters
No parameters
Response
Aggregation operation object. Chain stages and then call end() to execute
Example
- Grouped Statistics
final res = await db
.collection('todos')
.aggregate()
.match({'completed': true})
.group({
'_id': '\$priority',
'total': {'\$sum': 1},
})
.sort({'total': -1})
.end();
print('Aggregation results: ${res.data}');
startTransaction
Future<Transaction> db.startTransaction()
Starts a transaction and returns a transaction object. Use the transaction object's collection to get a collection reference within the transaction to operate on, and finally call commit to commit or rollback to roll back.
Parameters
No parameters
Response
Example
- Transfer Transaction
final _ = db.command;
final transaction = await db.startTransaction();
try {
await transaction.collection('accounts').doc('a').update({'balance': _.inc(-100)});
await transaction.collection('accounts').doc('b').update({'balance': _.inc(100)});
await transaction.commit();
} catch (e) {
await transaction.rollback();
}
runCommands
Future<DbRunCommandsResult> db.runCommands({required List<Map<String, dynamic>> commands, String? transactionId})
Executes native MongoDB database commands (in batch). Callable by administrators only.
Parameters
Array of command objects
Transaction ID (optional, executes all commands within the transaction)
Response
Example
- Example
final res = await db.runCommands(commands: [
{'find': 'todos', 'filter': {'completed': true}},
]);
print('Execution results: ${res.list}');
Geo
GeoNamespace get db.Geo
DbRegExp db.RegExp({required String regexp, String? options})
DbServerDate db.serverDate({int offset = 0})
Database helper types: the geolocation namespace Geo, the regular expression RegExp, and the server-side time serverDate.
Geosupportspoint,lineString,polygon,multiPoint,multiLineString, andmultiPolygon, used together with the operatorsgeoNear,geoWithin, andgeoIntersects.RegExpis used for fuzzy queries;optionssuch asimeans case-insensitive.serverDategenerates server-side time, whereoffsetis the offset in milliseconds.
Parameters
No parameters
Response
Geolocation namespace
Example
- Geolocation Query
- Regex Fuzzy Query
- Server-side Time
final _ = db.command;
// Query records within 5000 meters of the specified coordinates
final res = await db.collection('places').where({
'location': _.geoNear(
geometry: db.Geo.point(116.397, 39.908),
maxDistance: 5000,
),
}).get();
final res = await db.collection('todos').where({
'title': db.RegExp(regexp: 'study', options: 'i'),
}).get();
// Write the current server-side time
await db.collection('todos').add({
'title': 'Task',
'createdAt': db.serverDate(),
});
Data Model
getById
Future<GetByIdRes> app.data.model(collectionName).getById(String id)
Get a single record by ID.
Parameters
Record ID
Response
Example
- Example
final result = await app.data.model('users').getById('record-id-123');
if (result.isSuccess) {
final record = result.data?.record;
print('Record: ${record?.toJson()}');
} else {
print('Failed to get record: ${result.error!.message}');
}
get
Future<GetRes> app.data.model(collectionName).get([GetReq? params])
Query records with filters. Supports WHERE conditions, sorting, pagination, etc.
Parameters
Query parameters (optional)
Response
Example
- Basic Query
- Complex Query
final result = await app.data.model('users').get(
GetReq(
filter: 'age > 18',
sort: ['-createdAt'],
limit: 10,
),
);
if (result.isSuccess) {
for (final record in result.data?.records ?? []) {
print('User: ${record.toJson()}');
}
}
final result = await app.data.model('orders').get(
GetReq(
filter: 'status == "paid" && total > 100',
sort: ['-createdAt'],
limit: 20,
offset: 0,
),
);