ditto_live 4.6.0-alpha.1 copy "ditto_live: ^4.6.0-alpha.1" to clipboard
ditto_live: ^4.6.0-alpha.1 copied to clipboard

The Ditto Flutter SDK

example/lib/main.dart

import 'dart:convert';

import 'package:flutter/material.dart';

import 'package:ditto_live/ditto_live.dart';
import 'package:provider/provider.dart';

const appId = String.fromEnvironment("DITTO_APP_ID");
const token = String.fromEnvironment("DITTO_TOKEN");
const url = "$appId.cloud.ditto.live";

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  DittoLogger.instance.enabled = true;
  DittoLogger.instance.minLevel = DittoLogLevel.debug;
  DittoLogger.instance.addCustomLogCallback(
    (level, message) => print("[$level] => $message"),
  );

  // `String.fromEnvironment` doesn't read env vars, it reads values passed to flutter/dart via `--dart-define FOO=BAR`
  final identity = OnlinePlaygroundIdentity(
    appId: appId,
    token: token,
    baseUrl: "wss://$url",
  );

  final ditto = await Ditto.create(identity);
  const transportsConfig = TransportConfig(
    connect: ConnectTransportConfig(
      websocketUrls: ["wss://$url"],
    ),
  );

  ditto.transportConfig = transportsConfig;

  runApp(ChangeNotifierProvider.value(
    value: ditto,
    child: const MaterialApp(
      home: MyApp(),
      themeMode: ThemeMode.dark,
    ),
  ));
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _dqlController = TextEditingController();
  final _argsController = TextEditingController();

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final ditto = context.watch<Ditto>();

    return Scaffold(
      appBar: AppBar(title: const Text('Ditto Flutter Example')),
      body: ListView(
        children: [
          _contextTile(ditto),
          _syncTile(ditto),
          _dqlField,
          _dqlArgs,
          _submit(ditto),
        ],
      ),
    );
  }

  Widget _contextTile(Ditto ditto) => ListTile(
        title: Text("Ditto Version: ${Ditto.version}"),
        subtitle: Text(
          "x509 enabled: ${ditto.isX509Valid}, web enabled: ${ditto.isWebValid}",
        ),
      );

  Widget _syncTile(Ditto ditto) => SwitchListTile(
        title: const Text("Sync enabled"),
        value: ditto.isSyncActive,
        onChanged: (value) => value ? ditto.startSync() : ditto.stopSync(),
      );

  Widget get _dqlField => ListTile(
        title: TextField(
          controller: _dqlController,
          maxLines: null,
          decoration: const InputDecoration(labelText: "Execute DQL Query"),
        ),
      );

  Widget get _dqlArgs => ListTile(
        title: TextField(
          controller: _argsController,
          maxLines: null,
          decoration: const InputDecoration(labelText: "DQL args JSON"),
        ),
      );

  Widget _submit(Ditto ditto) => ElevatedButton.icon(
        icon: const Icon(Icons.send),
        label: const Text("Submit DQL"),
        onPressed: () {
          final args = _argsController.text.isEmpty
              ? null
              : jsonDecode(_argsController.text);
          final response = ditto.execute(_dqlController.text, queryArgs: args);

          showDialog(
            context: context,
            builder: (context) =>
                SimpleDialog(title: Text(response.toString()), children: [
              const ListTile(
                title: Text("Results"),
              ),
              ...response.results.map((value) => Text(json.encode(value))),
              const ListTile(
                title: Text("Affected"),
              ),
              ...response.affected
                  .map((documentId) => Text(documentId.toString())),
            ]),
          );
        },
      );
}