In-app messages are configured in the AppDNA Console and displayed automatically by the SDK when trigger conditions are met. No code is required to show messages.
How It Works
- You create an in-app message in the Console with content, layout, and trigger rules.
- The message definition is synced to the SDK via the config bundle.
- On every
track() call, the SDK evaluates all active message triggers.
- If conditions match, the message is presented automatically.
In-app messages are fully server-driven. You can change the message content, trigger rules, and audience without an app update.
Message Types
| Type | Description |
|---|
banner | Small bar at the top or bottom of the screen |
modal | Centered overlay with a dimmed background |
fullscreen | Full-screen takeover |
tooltip | Small popup anchored to a UI element |
Module Access
final messages = AppDNA.inAppMessages;
Module Methods
| Method | Signature | Description |
|---|
suppress | void suppress() | Suppress all in-app messages |
unsuppress | void unsuppress() | Resume showing in-app messages |
set delegate | set delegate(InAppMessageDelegate?) | Set a delegate for message callbacks |
Suppressing Messages
Suppress messages during critical flows:
AppDNA.inAppMessages.suppress();
startPurchaseFlow();
// Resume after purchase completes
void onPurchaseComplete() {
AppDNA.inAppMessages.unsuppress();
}
InAppMessageDelegate
class MessageHandler extends InAppMessageDelegate {
@override
void onMessagePresented(String messageId, String messageType) {
print("Message shown: $messageId ($messageType)");
}
@override
void onMessageAction(String messageId, String action, String? url) {
if (url != null) {
navigate(url);
}
}
@override
void onMessageDismissed(String messageId) {
print("Message dismissed: $messageId");
}
}
AppDNA.inAppMessages.delegate = MessageHandler();
Auto-Tracked Events
| Event | Trigger |
|---|
message_presented | An in-app message is displayed |
message_action | User taps an action in the message |
message_dismissed | Message is closed |
Full Example
import 'package:appdna_sdk/appdna_sdk.dart';
class AppCoordinator extends InAppMessageDelegate {
AppCoordinator() {
AppDNA.inAppMessages.delegate = this;
}
void startOnboarding() {
AppDNA.inAppMessages.suppress();
presentOnboardingFlow();
}
void onboardingDidFinish() {
AppDNA.inAppMessages.unsuppress();
}
@override
void onMessagePresented(String messageId, String messageType) { }
@override
void onMessageAction(String messageId, String action, String? url) {
switch (action) {
case "deep_link":
if (url != null) navigate(url);
break;
case "dismiss":
break;
}
}
@override
void onMessageDismissed(String messageId) { }
}
In-app messages are created in the Console under Engagement > In-App Messages. Design the message, set trigger rules, and publish.