Cached network images

This commit is contained in:
2024-05-03 12:15:54 +08:00
parent 9df4aba56c
commit e080f49935
11 changed files with 147 additions and 23 deletions

View File

@ -6,6 +6,7 @@ import 'package:solian/providers/friend.dart';
import 'package:solian/providers/navigation.dart';
import 'package:solian/providers/notify.dart';
import 'package:solian/router.dart';
import 'package:solian/utils/theme.dart';
import 'package:solian/utils/timeago.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:solian/utils/video_player.dart';
@ -24,21 +25,12 @@ void main() {
class SolianApp extends StatelessWidget {
const SolianApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp.router(
title: 'Solian',
theme: ThemeData(
brightness: Brightness.light,
colorScheme: ColorScheme.fromSeed(brightness: Brightness.light, seedColor: Colors.indigo),
useMaterial3: true,
),
darkTheme: ThemeData(
brightness: Brightness.dark,
colorScheme: ColorScheme.fromSeed(brightness: Brightness.dark, seedColor: Colors.indigo),
useMaterial3: true,
),
theme: SolianTheme.build(Brightness.light),
darkTheme: SolianTheme.build(Brightness.dark),
themeMode: ThemeMode.system,
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,

View File

@ -250,10 +250,4 @@ class _ChatScreenWidgetState extends State<ChatScreenWidget> {
onCallEnded: () => _chat.setOngoingCall(null),
);
}
@override
void deactivate() {
_chat.unFocus();
super.deactivate();
}
}

View File

@ -36,7 +36,7 @@ class _ChatIndexScreenState extends State<ChatIndexScreen> {
return IndentWrapper(
title: AppLocalizations.of(context)!.chat,
appBarActions: chat.focusChannel != null
appBarActions: isLargeScreen && chat.focusChannel != null
? [
ChannelCallAction(
call: chat.ongoingCall,

39
lib/utils/platform.dart Normal file
View File

@ -0,0 +1,39 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:package_info_plus/package_info_plus.dart';
abstract class PlatformInfo {
static bool get isWeb => kIsWeb;
static bool get isLinux => !kIsWeb && Platform.isLinux;
static bool get isWindows => !kIsWeb && Platform.isWindows;
static bool get isMacOS => !kIsWeb && Platform.isMacOS;
static bool get isIOS => !kIsWeb && Platform.isIOS;
static bool get isAndroid => !kIsWeb && Platform.isAndroid;
static bool get isMobile => isAndroid || isIOS;
// Not first tier supported platform
static bool get isBetaDesktop => isWindows || isLinux;
static bool get isDesktop => isLinux || isWindows || isMacOS;
static bool get useTouchscreen => !isMobile;
static bool get canCacheImage => isAndroid || isIOS || isMacOS;
static bool get canRecord => (isMobile || isMacOS);
static Future<String> getVersion() async {
var version = kIsWeb ? 'Web' : 'Unknown';
try {
version = (await PackageInfo.fromPlatform()).version;
} catch (_) {}
return version;
}
}

17
lib/utils/theme.dart Normal file
View File

@ -0,0 +1,17 @@
import 'package:flutter/material.dart';
abstract class SolianTheme {
static bool isColumnMode(BuildContext context) =>
MediaQuery.of(context).size.width > 640;
static ThemeData build(Brightness brightness) {
return ThemeData(
brightness: brightness,
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(brightness: brightness, seedColor: Colors.indigo),
snackBarTheme: const SnackBarThemeData(
behavior: SnackBarBehavior.floating,
),
);
}
}

View File

@ -1,4 +1,6 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:solian/utils/platform.dart';
import 'package:solian/utils/service_url.dart';
class AccountAvatar extends StatelessWidget {
@ -27,17 +29,19 @@ class AccountAvatar extends StatelessWidget {
);
}
if (direct == true) {
final image = PlatformInfo.canCacheImage ? CachedNetworkImageProvider(source) : NetworkImage(source);
return CircleAvatar(
radius: radius,
backgroundColor: backgroundColor,
backgroundImage: NetworkImage(source),
backgroundImage: image as ImageProvider,
);
} else {
final url = getRequestUri('passport', '/api/avatar/$source').toString();
final image = PlatformInfo.canCacheImage ? CachedNetworkImageProvider(url) : NetworkImage(url);
return CircleAvatar(
radius: radius,
backgroundColor: backgroundColor,
backgroundImage: NetworkImage(url),
backgroundImage: image as ImageProvider,
);
}
}

View File

@ -1,7 +1,9 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart';
import 'package:solian/models/post.dart';
import 'package:solian/utils/platform.dart';
import 'package:solian/utils/service_url.dart';
import 'package:flutter_carousel_widget/flutter_carousel_widget.dart';
import 'package:solian/widgets/posts/attachment_screen.dart';
@ -57,6 +59,7 @@ class _AttachmentItemState extends State<AttachmentItem> {
Widget content;
if (widget.type == 1) {
final image = PlatformInfo.canCacheImage ? CachedNetworkImageProvider(widget.url) : NetworkImage(widget.url);
content = GestureDetector(
child: ClipRRect(
borderRadius: const BorderRadius.all(borderRadius),
@ -64,8 +67,8 @@ class _AttachmentItemState extends State<AttachmentItem> {
tag: tag,
child: Stack(
children: [
Image.network(
widget.url,
Image(
image: image as ImageProvider,
key: Key(getTag()),
width: double.infinity,
height: double.infinity,