colveor_ui 0.3.0
colveor_ui: ^0.3.0 copied to clipboard
Themed Flutter UI toolkit with widgets, light/dark theming, go_router routing and base screen classes. The UI layer of Colveor.
example/lib/main.dart
import 'package:colveor_ui/colveor_ui.dart';
import 'package:colveor_ui/utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:colveor_ui_example/routes/app_routes.dart';
import 'package:colveor_ui_example/core/theme/app_theme.dart';
import 'package:colveor_ui_example/core/config/app_config.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
final config = AppConfig();
// Country data loads the first time a phone input is built. Pass
// `preloadCountries: true` to load it here instead.
await VoBootstrap.initialize(config: config);
runApp(
ColveorApp(
config: config,
appRoutes: appRoutes,
// The size the designs are drawn at; VoSizes scale from it.
designSize: const Size(390, 844),
observers: [_LogObserver()],
builder: (context, colveor) => App(colveor: colveor),
),
);
}
class App extends StatelessWidget {
const App({super.key, required this.colveor});
final ColveorRef colveor;
static const _theme = AppTheme();
@override
Widget build(BuildContext context) => MaterialApp.router(
title: AppConfig().appName,
debugShowCheckedModeBanner: false,
theme: _theme.light,
darkTheme: _theme.dark,
themeMode: colveor.themeMode,
routerConfig: colveor.router,
);
}
/// Logs provider updates in debug builds.
final class _LogObserver extends ProviderObserver {
@override
void didUpdateProvider(
ProviderObserverContext context,
Object? previousValue,
Object? newValue,
) => VoLogger.d('${context.provider}: $previousValue → $newValue');
}