simula_ads 1.0.0 copy "simula_ads: ^1.0.0" to clipboard
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,
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}
0
likes
140
points
11
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Flutter SDK for integrating contextual AI ads with Simula

Homepage

License

BSD-3-Clause (license)

Dependencies

flutter, http, provider, url_launcher, uuid, visibility_detector, webview_flutter

More

Packages that depend on simula_ads