simula_ads 1.0.0
simula_ads: ^1.0.0 copied to clipboard
Flutter SDK for integrating contextual AI ads with Simula
example/main.dart
import 'package:flutter/material.dart';
import 'package:simula_ads/simula_ads.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Simula Ads Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const ChatExample(),
);
}
}
class ChatExample extends StatefulWidget {
const ChatExample({super.key});
@override
State<ChatExample> createState() => _ChatExampleState();
}
class _ChatExampleState extends State<ChatExample> {
final List<Message> messages = [];
final TextEditingController _inputController = TextEditingController();
bool _loading = false;
@override
void dispose() {
_inputController.dispose();
super.dispose();
}
Future<void> _sendMessage() async {
if (_inputController.text.trim().isEmpty) return;
final userMessage = Message(
role: 'user',
content: _inputController.text.trim(),
);
setState(() {
messages.add(userMessage);
_inputController.clear();
_loading = true;
});
// Simulate LLM call
await Future.delayed(const Duration(seconds: 1));
final assistantMessage = Message(
role: 'assistant',
content: 'This is a simulated response to: ${userMessage.content}',
);
setState(() {
messages.add(assistantMessage);
_loading = false;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Simula Ads Example'),
),
body: SimulaProvider(
apiKey: 'SIMULA_xxx', // Replace with your API key
child: Column(
children: [
Expanded(
child: ListView.builder(
padding: const EdgeInsets.all(8.0),
itemCount: messages.length,
itemBuilder: (context, index) {
final msg = messages[index];
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0),
child: Text(
'${msg.role}: ${msg.content}',
style: const TextStyle(fontSize: 16),
),
),
if (msg.role == 'assistant')
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: NativeAdSlot(
key: ValueKey('adslot-$index'),
messages: messages.sublist(0, index + 1),
theme: InChatTheme(
mode: ThemeMode.light,
accent: AccentOption.blue,
width: double.infinity,
),
onImpression: (ad) {
debugPrint('Impression tracked: ${ad.id}');
},
onError: (error) {
debugPrint('Ad error: $error');
},
),
),
],
);
},
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
Expanded(
child: TextField(
controller: _inputController,
decoration: const InputDecoration(
hintText: 'Type a message...',
border: OutlineInputBorder(),
),
onSubmitted: (_) => _sendMessage(),
),
),
const SizedBox(width: 8),
IconButton(
icon: _loading
? const SizedBox(
width: 20,
height: 20,
child: CircularProgressIndicator(strokeWidth: 2),
)
: const Icon(Icons.send),
onPressed: _loading ? null : _sendMessage,
),
],
),
),
],
),
),
);
}
}