dynamic_backend_bridge 0.0.7
dynamic_backend_bridge: ^0.0.7 copied to clipboard
A dynamic backend switcher for Flutter providing unified, generic Auth and Database bridges supporting Supabase Cloud and Self-Hosted Supabase.
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:dynamic_backend_bridge/dynamic_backend_bridge.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final configService = ConfigService();
final config =
await configService.getSavedConfig() ??
AppConfig(backendType: BackendType.managed);
final container = ProviderContainer();
// Initialize the Dynamic Backend Bridge with optional default managed Supabase credentials
await DynamicBackendBridge.initialize(
config: config,
container: container,
defaultSupabaseUrl: 'https://your-project.supabase.co',
defaultSupabaseAnonKey: 'your-anon-key',
);
runApp(
UncontrolledProviderScope(
container: container,
child: MyApp(configService: configService),
),
);
}
class MyApp extends StatelessWidget {
final ConfigService configService;
const MyApp({super.key, required this.configService});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dynamic Backend Bridge Example',
theme: ThemeData.dark(),
home: HomeScreen(configService: configService),
);
}
}
class HomeScreen extends ConsumerWidget {
final ConfigService configService;
const HomeScreen({super.key, required this.configService});
@override
Widget build(BuildContext context, WidgetRef ref) {
// Watch instead of read so the UI rebuilds if backend state changes
final db = ref.watch(databaseRepositoryProvider);
final auth = ref.watch(authRepositoryProvider);
return Scaffold(
appBar: AppBar(
title: const Text('Backend Bridge Demo'),
actions: [
IconButton(
icon: const Icon(Icons.settings),
onPressed: () {
// Navigate to built-in Hosting Wizard UI
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => HostingWizard(
configService: configService,
onValidate: (newConfig) async {
// Return null on successful validation, or an error string
return null;
},
onComplete: (newConfig) async {
await DynamicBackendBridge.initialize(
config: newConfig,
ref: ref,
defaultSupabaseUrl: 'https://your-project.supabase.co',
defaultSupabaseAnonKey: 'your-anon-key',
);
if (context.mounted) {
Navigator.of(context).pop();
}
},
),
),
);
},
),
],
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'User Logged In: ${auth.currentUser != null}',
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () async {
final tasks = await db.fetchMap(collection: 'tasks');
debugPrint('Fetched ${tasks.length} tasks.');
},
child: const Text('Fetch Data'),
),
],
),
),
);
}
}