sqlite_loom_suite 0.1.0
sqlite_loom_suite: ^0.1.0 copied to clipboard
Cross-application local coordination and durable shared data for sqlite_loom suites.
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:sqlite_loom_suite/sqlite_loom_suite.dart';
import 'deployment.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
sqfliteFfiInit();
final root = await getApplicationSupportDirectory();
final path = p.join(root.path, 'example.publisher.shared', 'suite.sqlite3');
final transport = DirectSuiteTransport(
databaseFactory: databaseFactoryFfi,
pathResolver: (_) => path,
);
final appA = await SuiteClient.open(
SuiteConfiguration.desktop(
suiteId: SuiteId('example.publisher.shared'),
appId: SuiteAppId('example.publisher.app_a'),
appName: 'Example App A',
appVersion: '1.0.0',
databasePath: path,
deployment: exampleDeployment,
),
transport: transport,
);
final written = await appA.values.write('preferences', 'accent', 'indigo');
await appA.events.publish(
type: 'preference.changed',
payload: {'key': 'accent', 'revision': written.value?.revision},
);
final appB = await SuiteClient.open(
SuiteConfiguration.desktop(
suiteId: SuiteId('example.publisher.shared'),
appId: SuiteAppId('example.publisher.app_b'),
appName: 'Example App B',
appVersion: '1.0.0',
databasePath: path,
deployment: exampleDeployment,
),
transport: transport,
);
final sharedValue = await appB.values.read('preferences', 'accent');
final events = await appB.events.read(appId: appB.configuration.appId);
runApp(
ExampleApp(
appA: appA,
appB: appB,
message: 'App B read ${sharedValue?.value} and ${events.length} event(s)',
),
);
}
final class ExampleApp extends StatefulWidget {
const ExampleApp({
required this.appA,
required this.appB,
required this.message,
super.key,
});
final SuiteClient appA;
final SuiteClient appB;
final String message;
@override
State<ExampleApp> createState() => _ExampleAppState();
}
final class _ExampleAppState extends State<ExampleApp> {
@override
void dispose() {
widget.appA.close();
widget.appB.close();
super.dispose();
}
@override
Widget build(BuildContext context) => MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('SQLite Loom Suite')),
body: FutureBuilder<SuiteDiagnostics>(
future: widget.appB.diagnostics(),
builder: (context, snapshot) => Center(
child: Text(
snapshot.hasData
? '${widget.message}\nSuite healthy: ${snapshot.data!.databaseHealthy}'
: snapshot.hasError
? 'Error: ${snapshot.error}'
: Platform.operatingSystem,
),
),
),
),
);
}