A framework for building convergent cross-platform Nextcloud clients using Flutter.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
3.8 KiB

import 'dart:async';
2 years ago
import 'package:flutter/material.dart';
import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:neon/l10n/localizations.dart';
import 'package:neon/src/blocs/accounts.dart';
import 'package:neon/src/neon.dart';
import 'package:nextcloud/nextcloud.dart';
2 years ago
import 'package:rxdart/rxdart.dart';
import 'package:shared_preferences/shared_preferences.dart';
2 years ago
class NeonApp extends StatefulWidget {
const NeonApp({
required this.accountsBloc,
required this.sharedPreferences,
required this.env,
required this.platform,
required this.globalOptions,
2 years ago
super.key,
});
final AccountsBloc accountsBloc;
final SharedPreferences sharedPreferences;
final Env? env;
final NeonPlatform platform;
final GlobalOptions globalOptions;
2 years ago
@override
State<NeonApp> createState() => _NeonAppState();
2 years ago
}
// ignore: prefer_mixin
class _NeonAppState extends State<NeonApp> with WidgetsBindingObserver {
2 years ago
final _navigatorKey = GlobalKey<NavigatorState>();
CoreServerCapabilitiesOcsDataCapabilitiesTheming? _userTheme;
2 years ago
final _platformBrightness = BehaviorSubject<Brightness>.seeded(
WidgetsBinding.instance.window.platformBrightness,
);
@override
void didChangePlatformBrightness() {
_platformBrightness.add(WidgetsBinding.instance.window.platformBrightness);
super.didChangePlatformBrightness();
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
WidgetsBinding.instance.addPostFrameCallback((final _) {
widget.accountsBloc.activeAccount.listen((final activeAccount) async {
2 years ago
FlutterNativeSplash.remove();
if (activeAccount == null) {
await _navigatorKey.currentState!.pushAndRemoveUntil(
MaterialPageRoute(
builder: (final context) => const LoginPage(),
),
(final _) => false,
);
} else {
await _navigatorKey.currentState!.pushAndRemoveUntil(
MaterialPageRoute(
settings: const RouteSettings(
name: 'home',
),
2 years ago
builder: (final context) => HomePage(
account: activeAccount,
onThemeChanged: (final theme) {
setState(() {
_userTheme = theme;
});
},
),
),
(final _) => false,
);
}
});
});
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
unawaited(_platformBrightness.close());
2 years ago
super.dispose();
}
@override
Widget build(final BuildContext context) => StreamBuilder<Brightness>(
stream: _platformBrightness,
builder: (final context, final platformBrightnessSnapshot) => StreamBuilder<ThemeMode>(
stream: widget.globalOptions.themeMode.stream,
builder: (final context, final themeModeSnapshot) => StreamBuilder<bool>(
stream: widget.globalOptions.themeOLEDAsDark.stream,
builder: (final context, final themeOLEDAsDarkSnapshot) {
if (!platformBrightnessSnapshot.hasData ||
!themeOLEDAsDarkSnapshot.hasData ||
!themeModeSnapshot.hasData) {
return Container();
}
return MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
navigatorKey: _navigatorKey,
theme: getThemeFromNextcloudTheme(
_userTheme,
themeModeSnapshot.data!,
platformBrightnessSnapshot.data!,
oledAsDark: themeOLEDAsDarkSnapshot.data!,
),
home: Container(),
);
},
),
2 years ago
),
);
2 years ago
}