153 lines
4.3 KiB
Dart
153 lines
4.3 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:example/choose_user_page.dart';
|
|
import 'package:example/home_page.dart';
|
|
import 'package:example/splash_screen.dart';
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/scheduler.dart';
|
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
|
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
|
|
import 'package:stream_chat_persistence/stream_chat_persistence.dart';
|
|
import 'package:streaming_shared_preferences/streaming_shared_preferences.dart';
|
|
|
|
import 'app_config.dart';
|
|
import 'routes/app_routes.dart';
|
|
import 'routes/routes.dart';
|
|
|
|
final chatPersistentClient = StreamChatPersistenceClient(
|
|
logLevel: Level.SEVERE,
|
|
connectionMode: ConnectionMode.regular,
|
|
);
|
|
|
|
void main() async {
|
|
runApp(MyApp());
|
|
}
|
|
|
|
class MyApp extends StatefulWidget {
|
|
@override
|
|
_MyAppState createState() => _MyAppState();
|
|
}
|
|
|
|
class _MyAppState extends State<MyApp>
|
|
with SplashScreenStateMixin, TickerProviderStateMixin {
|
|
InitData? _initData;
|
|
|
|
Future<InitData> _initConnection() async {
|
|
String? apiKey, userId, token;
|
|
|
|
if (!kIsWeb) {
|
|
final secureStorage = FlutterSecureStorage();
|
|
apiKey = await secureStorage.read(key: kStreamApiKey);
|
|
userId = await secureStorage.read(key: kStreamUserId);
|
|
token = await secureStorage.read(key: kStreamToken);
|
|
}
|
|
|
|
final client = StreamChatClient(
|
|
apiKey ?? kDefaultStreamApiKey,
|
|
logLevel: Level.SEVERE,
|
|
)..chatPersistenceClient = chatPersistentClient;
|
|
|
|
if (userId != null && token != null) {
|
|
await client.connectUser(
|
|
User(id: userId),
|
|
token,
|
|
);
|
|
}
|
|
|
|
final prefs = await StreamingSharedPreferences.instance;
|
|
|
|
return InitData(client, prefs);
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
final timeOfStartMs = DateTime.now().millisecondsSinceEpoch;
|
|
|
|
_initConnection().then(
|
|
(initData) {
|
|
setState(() {
|
|
_initData = initData;
|
|
});
|
|
|
|
final now = DateTime.now().millisecondsSinceEpoch;
|
|
|
|
if (now - timeOfStartMs > 1500) {
|
|
SchedulerBinding.instance!.addPostFrameCallback((timeStamp) {
|
|
forwardAnimations();
|
|
});
|
|
} else {
|
|
Future.delayed(Duration(milliseconds: 1500)).then((value) {
|
|
forwardAnimations();
|
|
});
|
|
}
|
|
},
|
|
);
|
|
|
|
super.initState();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Stack(
|
|
alignment: Alignment.center,
|
|
children: [
|
|
if (_initData != null)
|
|
PreferenceBuilder<int>(
|
|
preference: _initData!.preferences.getInt(
|
|
'theme',
|
|
defaultValue: 0,
|
|
),
|
|
builder: (context, snapshot) => MaterialApp(
|
|
theme: ThemeData.light(),
|
|
darkTheme: ThemeData.dark(),
|
|
themeMode: {
|
|
-1: ThemeMode.dark,
|
|
0: ThemeMode.system,
|
|
1: ThemeMode.light,
|
|
}[snapshot],
|
|
builder: (context, child) => StreamChatTheme(
|
|
data: StreamChatThemeData(
|
|
brightness: Theme.of(context).brightness,
|
|
),
|
|
child: child!,
|
|
),
|
|
onGenerateRoute: AppRoutes.generateRoute,
|
|
onGenerateInitialRoutes: (initialRouteName) {
|
|
if (initialRouteName == Routes.HOME) {
|
|
return [
|
|
AppRoutes.generateRoute(
|
|
RouteSettings(
|
|
name: Routes.HOME,
|
|
arguments: HomePageArgs(_initData!.client),
|
|
),
|
|
)!
|
|
];
|
|
}
|
|
return [
|
|
AppRoutes.generateRoute(
|
|
RouteSettings(
|
|
name: Routes.CHOOSE_USER,
|
|
),
|
|
)!
|
|
];
|
|
},
|
|
initialRoute: _initData!.client.state.currentUser == null
|
|
? Routes.CHOOSE_USER
|
|
: Routes.HOME,
|
|
),
|
|
),
|
|
if (!animationCompleted) buildAnimation(),
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
class InitData {
|
|
final StreamChatClient client;
|
|
final StreamingSharedPreferences preferences;
|
|
|
|
InitData(this.client, this.preferences);
|
|
}
|