ditto_live 4.6.0-alpha.1
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())),
]),
);
},
);
}