locality_social_cloud 1.7.0
locality_social_cloud: ^1.7.0 copied to clipboard
Write social apps with Flutter. This code connects to the backend of Locality Social Cloud to provide realtime state synchronization across devices.
example/locality_social_cloud_example.dart
import 'package:flutter/material.dart';
import 'package:locality_social_cloud/api/locality_social_cloud.dart';
import 'package:provider/provider.dart';
Future<LocalitySocialCloud?> startCloud() async {
return LocalitySocialCloud.up(
appId: "YOUR_APP_ID",
/// NOTE: The last letter of your app secret is '='; It is NOT whitespace
appSecret: "YOUR_APP_SECRET",
username: "YOUR_USERNAME",
password: "YOUR_PASSWORD",
onError: (AuthError error) {
print(error.toString());
},
);
}
GlobalClickCounter globalClickCounter = GlobalClickCounter();
void main() async {
LocalitySocialCloud? myCloud = await startCloud();
if (myCloud != null) {
print("Locality Social Cloud was started!");
}
LocalitySocialCloud.supervise(globalClickCounter);
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => globalClickCounter),
],
child: const MyApp(),
),
);
}
class GlobalClickCounter extends ThrottledChangeNotifier with PubSub {
int counter = 0;
/// This is a global click counter. All users can increase the click counter. All users see the same click counter.
@override
String getTopic() {
return 'global-click-counter';
}
void increaseCounterByOne() {
print("INCERASE COUNTER");
send('increaseCounter', {'amount': 1});
}
@override
void onReceive(LocalityEvent localityEvent) {
switch (localityEvent.event) {
case 'increaseCounter':
counter += localityEvent.payload['amount'] as int;
notifyListeners();
break;
}
}
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
Widget build(BuildContext context) {
final globalClickCounter = Provider.of<GlobalClickCounter>(context);
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text('You have pushed the button this many times globally:'),
Consumer<GlobalClickCounter>(
builder: (context, globalClickCounter, child) => Text(
'${globalClickCounter.counter}',
style: Theme.of(context).textTheme.headlineMedium,
),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
globalClickCounter.increaseCounterByOne();
},
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}