Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .fvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"flutter": "3.29.3"
}
2 changes: 1 addition & 1 deletion .github/browserstack-devices.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ flutter:
- "Google Pixel 6-12.0" # Android 12 support
ios:
devices:
- "iPhone 13-15" # iOS 15 support
- "iPhone 13-16" # iOS 16 support (min deployment target is 15.6)
- "iPhone 14-16" # iOS 16 current
- "iPhone 12-17" # iOS 17 latest

Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,6 @@ packages/
Pods/
target/
xcuserdata

# FVM Version Cache
.fvm/
12 changes: 10 additions & 2 deletions flutter_app/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,22 @@ This is a basic task application that demonstrates how to use Ditto's peer-to-pe
## Prerequisites

- Dart SDK installed
- Flutter SDK installed (tested on 3.24)
- Flutter SDK installed (tested on 3.29)
- Java Virtual Machine (JVM) 11 installed
- Git command line installed (Windows requirement)
- XCode installed (for iOS development)
- Android Studio installed (for managing the Android SDK)
- Android SDK installed
- IDE of choice (Android Studio, VS Code, etc)

### MacOS Development
This has been tested with XCode 26.2 on MacOS 26.6 with Flutter 3.29.3.

### Windows Development
To build the Windows version of this Flutter app requires Visual Studio 2022 specifically be
installed and configured with C++ and cmake installed from the Visual Studio Installer. This has
been tested with Flutter version 3.29.3 on Windows.

## Getting Started

### 1. Clone the Repository
Expand Down Expand Up @@ -78,7 +86,7 @@ Please choose one (or "q" to quit):
> If you are going to use a physical iPhone, you will need to update the Team under Signing & Capabilities in XCode. You can open the ios/Runner.xcodeproj file in XCode and then set your team from the Runner Target -> Signing & Capabilities tab.
>

- Ensure that cocoapods is up to date
- Ensure that cocoapods is up to date (or you can use Homebrew with `brew install cocoapods`)

```bash
gem install cocoapods
Expand Down
16 changes: 8 additions & 8 deletions flutter_app/ios/Podfile.lock
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
PODS:
- ditto_live (4.13.1):
- DittoFlutter (= 4.13.1)
- ditto_live (5.0.0-rc.1):
- DittoFlutter (= 5.0.0-rc.1)
- Flutter
- DittoFlutter (4.13.1)
- DittoFlutter (5.0.0-rc.1)
- Flutter (1.0.0)
- integration_test (0.0.1):
- Flutter
Expand Down Expand Up @@ -36,12 +36,12 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/permission_handler_apple/ios"

SPEC CHECKSUMS:
ditto_live: 93459c7d7c067ba16d4104925ea80c54dd13bf67
DittoFlutter: 26e21d5665e9bcc11660c4eceb1ec66b8ba64667
ditto_live: 8536ab4af437fb23e15fdbef9c59bfa6abb95fc5
DittoFlutter: 2d2269478637f4e8bda53def335bd1a728d5ddf0
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d

PODFILE CHECKSUM: 1959d098c91d8a792531a723c4a9d7e9f6a01e38

Expand Down
3 changes: 3 additions & 0 deletions flutter_app/ios/Runner.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,7 @@
DEVELOPMENT_TEAM = 3T2VMFZPPQ;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -685,6 +686,7 @@
DEVELOPMENT_TEAM = 3T2VMFZPPQ;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand All @@ -710,6 +712,7 @@
DEVELOPMENT_TEAM = 3T2VMFZPPQ;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.6;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Release"
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
Expand Down
44 changes: 21 additions & 23 deletions flutter_app/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ class _DittoExampleState extends State<DittoExample> {
dotenv.env['DITTO_APP_ID'] ?? (throw Exception("env not found"));
final token = dotenv.env['DITTO_PLAYGROUND_TOKEN'] ??
(throw Exception("env not found"));
final authUrl = dotenv.env['DITTO_AUTH_URL'];
final authUrl =
dotenv.env['DITTO_AUTH_URL'] ?? (throw Exception("env not found"));
final websocketUrl =
dotenv.env['DITTO_WEBSOCKET_URL'] ?? (throw Exception("env not found"));

Expand Down Expand Up @@ -70,26 +71,22 @@ class _DittoExampleState extends State<DittoExample> {

await Ditto.init();

final identity = OnlinePlaygroundIdentity(
appID: appID,
token: token,
enableDittoCloudSync:
false, // This is required to be set to false to use the correct URLs
customAuthUrl: authUrl);

final ditto = await Ditto.open(identity: identity);

ditto.updateTransportConfig((config) {
// Note: this will not enable peer-to-peer sync on the web platform
config.setAllPeerToPeerEnabled(true);
config.connect.webSocketUrls.add(websocketUrl);
DittoLogger.isEnabled = true;
DittoLogger.minimumLogLevel = LogLevel.debug;

//new configuration - https://docs.ditto.live/sdk/latest/ditto-config
final config = DittoConfig(
databaseID: appID, connect: DittoConfigConnectServer(url: authUrl));
final ditto = await Ditto.open(config);
await ditto.auth.setExpirationHandler((ditto, timeUntilExpiration) async {
final authResult = await ditto.auth
.login(token: token, provider: Authenticator.developmentProvider);
if (authResult.exception != null) {
throw authResult.exception!;
}
});

// Disable DQL strict mode
// https://docs.ditto.live/dql/strict-mode
await ditto.store.execute("ALTER SYSTEM SET DQL_STRICT_MODE = false");

ditto.startSync();
ditto.sync.start();

if (mounted) {
setState(() => _ditto = ditto);
Expand Down Expand Up @@ -167,19 +164,20 @@ class _DittoExampleState extends State<DittoExample> {

Widget get _syncTile => SwitchListTile(
title: const Text("Sync Active"),
value: _ditto!.isSyncActive,
value: _ditto!.sync.isActive,
onChanged: (value) {
if (value) {
setState(() => _ditto!.startSync());
setState(() => _ditto!.sync.start());
} else {
setState(() => _ditto!.stopSync());
setState(() => _ditto!.sync.stop());
}
},
);

//TODO review to see if we want to add in the order by title asc back in by making the dql builder use two queries.
Widget get _tasksList => DqlBuilder(
ditto: _ditto!,
query: "SELECT * FROM tasks WHERE deleted = false ORDER BY title ASC",
query: "SELECT * FROM tasks WHERE deleted = false",
builder: (context, result) {
final tasks = result.items.map((r) => r.value).map(Task.fromJson);
return ListView(
Expand Down
12 changes: 6 additions & 6 deletions flutter_app/macos/Podfile.lock
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
PODS:
- ditto_live (4.13.1):
- DittoFlutter (= 4.13.1)
- ditto_live (5.0.0-rc.1):
- DittoFlutter (= 5.0.0-rc.1)
- FlutterMacOS
- DittoFlutter (4.13.1)
- DittoFlutter (5.0.0-rc.1)
- FlutterMacOS (1.0.0)
- path_provider_foundation (0.0.1):
- Flutter
Expand All @@ -26,10 +26,10 @@ EXTERNAL SOURCES:
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin

SPEC CHECKSUMS:
ditto_live: a46b3eba63227c95adffe6094d3153a74c060d0c
DittoFlutter: 26e21d5665e9bcc11660c4eceb1ec66b8ba64667
ditto_live: 5e30d1209a9f21d05167aa6da499e3b5ceccb1be
DittoFlutter: 2d2269478637f4e8bda53def335bd1a728d5ddf0
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564

PODFILE CHECKSUM: 7eb978b976557c8c1cd717d8185ec483fd090a82

Expand Down
2 changes: 2 additions & 0 deletions flutter_app/macos/Runner/DebugProfile.entitlements
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@
<true/>
<key>com.apple.security.network.server</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>
40 changes: 20 additions & 20 deletions flutter_app/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ packages:
dependency: transitive
description:
name: async
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
url: "https://pub.dev"
source: hosted
version: "2.13.0"
version: "2.12.0"
boolean_selector:
dependency: transitive
description:
Expand Down Expand Up @@ -69,26 +69,26 @@ packages:
dependency: "direct main"
description:
name: ditto_live
sha256: f095d52ec464e0c50323a4c37717a4e4727c00c035be8e11c0120b5bac927103
sha256: "5e022a2687dc1d38c8e9173cedca536734db7da6daef296f0cb5987e44256c43"
url: "https://pub.dev"
source: hosted
version: "4.13.1"
version: "5.0.0-rc.1"
equatable:
dependency: "direct main"
description:
name: equatable
sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7"
sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b"
url: "https://pub.dev"
source: hosted
version: "2.0.7"
version: "2.0.8"
fake_async:
dependency: transitive
description:
name: fake_async
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
url: "https://pub.dev"
source: hosted
version: "1.3.3"
version: "1.3.2"
ffi:
dependency: transitive
description:
Expand All @@ -114,10 +114,10 @@ packages:
dependency: "direct main"
description:
name: flutter_dotenv
sha256: b7c7be5cd9f6ef7a78429cabd2774d3c4af50e79cb2b7593e3d5d763ef95c61b
sha256: d4130c4a43e0b13fefc593bc3961f2cb46e30cb79e253d4a526b1b5d24ae1ce4
url: "https://pub.dev"
source: hosted
version: "5.2.1"
version: "6.0.0"
flutter_driver:
dependency: transitive
description: flutter
Expand Down Expand Up @@ -179,10 +179,10 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0"
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
url: "https://pub.dev"
source: hosted
version: "10.0.9"
version: "10.0.8"
leak_tracker_flutter_testing:
dependency: transitive
description:
Expand Down Expand Up @@ -299,18 +299,18 @@ packages:
dependency: "direct main"
description:
name: permission_handler
sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849"
sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1
url: "https://pub.dev"
source: hosted
version: "11.4.0"
version: "12.0.1"
permission_handler_android:
dependency: transitive
description:
name: permission_handler_android
sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc
sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6"
url: "https://pub.dev"
source: hosted
version: "12.1.0"
version: "13.0.1"
permission_handler_apple:
dependency: transitive
description:
Expand Down Expand Up @@ -448,10 +448,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
url: "https://pub.dev"
source: hosted
version: "15.0.0"
version: "14.3.1"
web:
dependency: transitive
description:
Expand All @@ -464,10 +464,10 @@ packages:
dependency: transitive
description:
name: webdriver
sha256: "2f3a14ca026957870cfd9c635b83507e0e51d8091568e90129fbf805aba7cade"
sha256: "3d773670966f02a646319410766d3b5e1037efb7f07cc68f844d5e06cd4d61c8"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
version: "3.0.4"
xdg_directories:
dependency: transitive
description:
Expand Down
6 changes: 3 additions & 3 deletions flutter_app/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,15 @@ dependencies:
flutter:
sdk: flutter

ditto_live: 4.13.1
ditto_live: 5.0.0-rc.1

# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
equatable: ^2.0.5
permission_handler: ^11.3.1
permission_handler: ^12.0.1
json_annotation: ^4.9.0
flutter_dotenv: ^5.1.0
flutter_dotenv: ^6.0.0

dev_dependencies:
flutter_test:
Expand Down
16 changes: 10 additions & 6 deletions flutter_app/test/widget_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,16 @@ import 'package:flutter_quickstart/main.dart';
void main() {
setUpAll(() async {
// Initialize dotenv for testing
dotenv.testLoad(fileInput: '''
DITTO_APP_ID=test_app_id
DITTO_PLAYGROUND_TOKEN=test_playground_token
DITTO_AUTH_URL=https://auth.example.com
DITTO_WEBSOCKET_URL=wss://websocket.example.com
''');
await dotenv.load(
fileName: '.env',
mergeWith: {
'DITTO_APP_ID': 'test_app_id',
'DITTO_PLAYGROUND_TOKEN': 'test_playground_token',
'DITTO_AUTH_URL': 'https://auth.example.com',
'DITTO_WEBSOCKET_URL': 'wss://websocket.example.com',
},
isOptional: true,
);
});

testWidgets('Counter increments smoke test', (WidgetTester tester) async {
Expand Down
Loading
Loading