ditto_live 4.8.0-beta.6
ditto_live: ^4.8.0-beta.6 copied to clipboard
The Ditto Flutter SDK
example/lib/main.dart
// ignore_for_file: invalid_use_of_visible_for_testing_member
import 'dart:io';
import 'package:ditto_live/ditto_live.dart';
import 'package:ditto_live_example/dialog.dart';
import 'package:ditto_live_example/dql_builder.dart';
import 'package:ditto_live_example/task.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
const appID = "caf9e870-d416-4b1c-9ab4-fb6e8319dd25";
const token = "cb639c76-5633-44dd-ad28-03a5a43f092e";
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
print(await Ditto.sdkVersion);
runApp(const MaterialApp(home: DittoExample()));
}
class DittoExample extends StatefulWidget {
const DittoExample({super.key});
@override
State<DittoExample> createState() => _DittoExampleState();
}
class _DittoExampleState extends State<DittoExample> {
Ditto? _ditto;
var _syncing = true;
@override
void initState() {
super.initState();
_initDitto();
}
Future<void> _initDitto() async {
await [
Permission.bluetoothConnect,
Permission.bluetoothAdvertise,
Permission.nearbyWifiDevices,
Permission.bluetoothScan
].request();
final identity = await OnlinePlaygroundIdentity.create(
appID: appID,
token: token,
);
final dataDir = await getApplicationDocumentsDirectory();
final persistenceDirectory = Directory("${dataDir.path}/ditto");
await persistenceDirectory.create(recursive: true);
final ditto = await Ditto.open(
identity: identity,
persistenceDirectory: persistenceDirectory,
);
await ditto.startSync();
setState(() => _ditto = ditto);
}
Future<void> _addTask() async {
final task = await showAddTaskDialog(context);
if (task == null) return;
await _ditto!.store.execute(
"INSERT INTO tasks DOCUMENTS (:task)",
arguments: {"task": task.toJson()},
);
}
Future<void> _clearTasks() async {
await _ditto!.store.execute("EVICT FROM tasks WHERE true");
}
@override
Widget build(BuildContext context) {
final ditto = _ditto;
if (ditto == null) return _loading;
return Scaffold(
appBar: AppBar(
title: const Text("Ditto Tasks"),
actions: [
IconButton(
icon: const Icon(Icons.clear),
tooltip: "Clear",
onPressed: _clearTasks,
),
],
),
floatingActionButton: _fab,
body: Column(
children: [
_syncTile,
const Divider(height: 1),
Expanded(child: _tasksList),
],
),
);
}
Widget get _loading => Scaffold(
appBar: AppBar(title: const Text("Ditto Tasks")),
body: const Center(
child: CircularProgressIndicator(),
),
);
Widget get _fab => FloatingActionButton(
onPressed: _addTask,
child: const Icon(Icons.add_task),
);
Widget get _syncTile => SwitchListTile(
title: const Text("Syncing"),
value: _syncing,
onChanged: (value) async {
if (value) {
await _ditto!.startSync();
} else {
await _ditto!.stopSync();
}
setState(() => _syncing = value);
},
);
Widget get _tasksList => DqlBuilder(
ditto: _ditto!,
query: "SELECT * FROM tasks WHERE deleted = false",
builder: (context, response) {
final tasks = response.items.map((r) => r.value).map(Task.fromJson);
return ListView(
children: tasks.map(_singleTask).toList(),
);
},
);
Widget _singleTask(Task task) => Dismissible(
key: Key("${task.id}-${task.title}"),
onDismissed: (direction) async {
await _ditto!.store.execute(
"UPDATE tasks SET deleted = true WHERE _id = '${task.id}'",
);
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Deleted Task ${task.title}")),
);
}
},
background: _dismissibleBackground(true),
secondaryBackground: _dismissibleBackground(false),
child: CheckboxListTile(
title: Text(task.title),
subtitle: Text(task.description),
value: task.done,
onChanged: (value) => _ditto!.store.execute(
"UPDATE tasks SET done = $value WHERE _id = '${task.id}'",
),
),
);
Widget _dismissibleBackground(bool primary) => Container(
color: Colors.red,
child: Align(
alignment: primary ? Alignment.centerLeft : Alignment.centerRight,
child: const Padding(
padding: EdgeInsets.all(8.0),
child: Icon(Icons.delete),
),
),
);
}
class Foo {
/// Doc 1
final String xxxx;
/// Doc 2
final String yyyy;
/// Parameter `zzzz` controls whether to go to space
Foo({
required this.xxxx,
required this.yyyy,
String zzzz = "hello",
});
}
void foo() {}