update flutter to 3.27.0 & update packages

This commit is contained in:
2024-12-12 16:41:42 +08:00
parent 4801457e0e
commit af9835eb8f
31 changed files with 172 additions and 266 deletions

View File

@@ -76,7 +76,7 @@ class _AppbarState extends State<Appbar> {
var content = Container(
decoration: BoxDecoration(
color: widget.backgroundColor ??
context.colorScheme.surface.withOpacity(0.72),
context.colorScheme.surface.toOpacity(0.72),
),
height: _kAppBarHeight + context.padding.top,
child: Row(
@@ -219,7 +219,7 @@ class _MySliverAppBarDelegate extends SliverPersistentHeaderDelegate {
child: BlurEffect(
blur: 15,
child: Material(
color: context.colorScheme.surface.withOpacity(0.72),
color: context.colorScheme.surface.toOpacity(0.72),
elevation: 0,
borderRadius: BorderRadius.circular(radius),
child: body,
@@ -734,6 +734,7 @@ class _SliverSearchBarDelegate extends SliverPersistentHeaderDelegate {
icon: const Icon(Icons.clear),
onPressed: () {
editingController.clear();
onChanged?.call("");
},
);
},

View File

@@ -214,7 +214,7 @@ class _ButtonState extends State<Button> {
boxShadow: (isHover && !isLoading && (widget.type == ButtonType.filled || widget.type == ButtonType.normal))
? [
BoxShadow(
color: Colors.black.withOpacity(0.1),
color: Colors.black.toOpacity(0.1),
blurRadius: 2,
offset: const Offset(0, 1),
)
@@ -248,7 +248,7 @@ class _ButtonState extends State<Button> {
if (widget.type == ButtonType.filled) {
var color = widget.color ?? context.colorScheme.primary;
if (isHover) {
return color.withOpacity(0.9);
return color.toOpacity(0.9);
} else {
return color;
}
@@ -256,13 +256,13 @@ class _ButtonState extends State<Button> {
if (widget.type == ButtonType.normal) {
var color = widget.color ?? context.colorScheme.surfaceContainer;
if (isHover) {
return color.withOpacity(0.9);
return color.toOpacity(0.9);
} else {
return color;
}
}
if (isHover) {
return context.colorScheme.outline.withOpacity(0.2);
return context.colorScheme.outline.toOpacity(0.2);
}
return Colors.transparent;
}
@@ -345,7 +345,7 @@ class _IconButtonState extends State<_IconButton> {
? Theme.of(context)
.colorScheme
.outlineVariant
.withOpacity(0.4)
.toOpacity(0.4)
: null,
borderRadius: BorderRadius.circular((iconSize + 12) / 2),
),

View File

@@ -144,7 +144,7 @@ class ComicTile extends StatelessWidget {
if (history != null)
Container(
height: 24,
color: Colors.blue.withOpacity(0.9),
color: Colors.blue.toOpacity(0.9),
constraints: const BoxConstraints(minWidth: 24),
padding: const EdgeInsets.symmetric(horizontal: 4),
child: CustomPaint(
@@ -293,7 +293,7 @@ class ComicTile extends StatelessWidget {
Radius.circular(10.0),
),
child: Container(
color: Colors.black.withOpacity(0.5),
color: Colors.black.toOpacity(0.5),
child: Padding(
padding:
const EdgeInsets.fromLTRB(8, 6, 8, 6),
@@ -475,7 +475,7 @@ class _ComicDescription extends StatelessWidget {
subtitle,
style: TextStyle(
fontSize: 10.0,
color: context.colorScheme.onSurface.withOpacity(0.7)),
color: context.colorScheme.onSurface.toOpacity(0.7)),
maxLines: 1,
softWrap: true,
overflow: TextOverflow.ellipsis,
@@ -780,7 +780,7 @@ class _SliverGridComics extends StatelessWidget {
duration: const Duration(milliseconds: 150),
decoration: BoxDecoration(
color: isSelected
? Theme.of(context).colorScheme.secondaryContainer.withOpacity(0.72)
? Theme.of(context).colorScheme.secondaryContainer.toOpacity(0.72)
: null,
borderRadius: BorderRadius.circular(12),
),

View File

@@ -1,5 +1,3 @@
library components;
import 'dart:async';
import 'dart:collection';
import 'dart:math' as math;

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:venera/foundation/app.dart';
/// patched slider.dart with RtL support
class _SliderDefaultsM3 extends SliderThemeData {
@@ -15,45 +16,45 @@ class _SliderDefaultsM3 extends SliderThemeData {
Color? get inactiveTrackColor => _colors.surfaceContainerHighest;
@override
Color? get secondaryActiveTrackColor => _colors.primary.withOpacity(0.54);
Color? get secondaryActiveTrackColor => _colors.primary.toOpacity(0.54);
@override
Color? get disabledActiveTrackColor => _colors.onSurface.withOpacity(0.38);
Color? get disabledActiveTrackColor => _colors.onSurface.toOpacity(0.38);
@override
Color? get disabledInactiveTrackColor => _colors.onSurface.withOpacity(0.12);
Color? get disabledInactiveTrackColor => _colors.onSurface.toOpacity(0.12);
@override
Color? get disabledSecondaryActiveTrackColor => _colors.onSurface.withOpacity(0.12);
Color? get disabledSecondaryActiveTrackColor => _colors.onSurface.toOpacity(0.12);
@override
Color? get activeTickMarkColor => _colors.onPrimary.withOpacity(0.38);
Color? get activeTickMarkColor => _colors.onPrimary.toOpacity(0.38);
@override
Color? get inactiveTickMarkColor => _colors.onSurfaceVariant.withOpacity(0.38);
Color? get inactiveTickMarkColor => _colors.onSurfaceVariant.toOpacity(0.38);
@override
Color? get disabledActiveTickMarkColor => _colors.onSurface.withOpacity(0.38);
Color? get disabledActiveTickMarkColor => _colors.onSurface.toOpacity(0.38);
@override
Color? get disabledInactiveTickMarkColor => _colors.onSurface.withOpacity(0.38);
Color? get disabledInactiveTickMarkColor => _colors.onSurface.toOpacity(0.38);
@override
Color? get thumbColor => _colors.primary;
@override
Color? get disabledThumbColor => Color.alphaBlend(_colors.onSurface.withOpacity(0.38), _colors.surface);
Color? get disabledThumbColor => Color.alphaBlend(_colors.onSurface.toOpacity(0.38), _colors.surface);
@override
Color? get overlayColor => WidgetStateColor.resolveWith((Set<WidgetState> states) {
if (states.contains(WidgetState.dragged)) {
return _colors.primary.withOpacity(0.1);
return _colors.primary.toOpacity(0.1);
}
if (states.contains(WidgetState.hovered)) {
return _colors.primary.withOpacity(0.08);
return _colors.primary.toOpacity(0.08);
}
if (states.contains(WidgetState.focused)) {
return _colors.primary.withOpacity(0.1);
return _colors.primary.toOpacity(0.1);
}
return Colors.transparent;

View File

@@ -141,7 +141,7 @@ class FlyoutState extends State<Flyout> {
animation: animation,
builder: (context, builder) {
return ColoredBox(
color: Colors.black.withOpacity(0.3 * animation.value),
color: Colors.black.toOpacity(0.3 * animation.value),
);
},
),
@@ -185,12 +185,18 @@ class FlyoutContent extends StatelessWidget {
child: Material(
borderRadius: BorderRadius.circular(8),
type: MaterialType.card,
color: context.colorScheme.surface.withOpacity(0.82),
color: context.colorScheme.surface.toOpacity(0.82),
child: Container(
constraints: const BoxConstraints(
minWidth: minFlyoutWidth,
),
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
border: context.brightness == ui.Brightness.dark
? Border.all(color: context.colorScheme.outlineVariant)
: null,
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
@@ -215,108 +221,3 @@ class FlyoutContent extends StatelessWidget {
);
}
}
class FlyoutTextButton extends StatefulWidget {
const FlyoutTextButton(
{super.key,
required this.child,
required this.flyoutBuilder,
this.navigator});
final Widget child;
final WidgetBuilder flyoutBuilder;
final NavigatorState? navigator;
@override
State<FlyoutTextButton> createState() => _FlyoutTextButtonState();
}
class _FlyoutTextButtonState extends State<FlyoutTextButton> {
final FlyoutController _controller = FlyoutController();
@override
Widget build(BuildContext context) {
return Flyout(
controller: _controller,
flyoutBuilder: widget.flyoutBuilder,
navigator: widget.navigator,
child: TextButton(
onPressed: () {
_controller.show();
},
child: widget.child,
));
}
}
class FlyoutIconButton extends StatefulWidget {
const FlyoutIconButton(
{super.key,
required this.icon,
required this.flyoutBuilder,
this.navigator});
final Widget icon;
final WidgetBuilder flyoutBuilder;
final NavigatorState? navigator;
@override
State<FlyoutIconButton> createState() => _FlyoutIconButtonState();
}
class _FlyoutIconButtonState extends State<FlyoutIconButton> {
final FlyoutController _controller = FlyoutController();
@override
Widget build(BuildContext context) {
return Flyout(
controller: _controller,
flyoutBuilder: widget.flyoutBuilder,
navigator: widget.navigator,
child: IconButton(
onPressed: () {
_controller.show();
},
icon: widget.icon,
));
}
}
class FlyoutFilledButton extends StatefulWidget {
const FlyoutFilledButton(
{super.key,
required this.child,
required this.flyoutBuilder,
this.navigator});
final Widget child;
final WidgetBuilder flyoutBuilder;
final NavigatorState? navigator;
@override
State<FlyoutFilledButton> createState() => _FlyoutFilledButtonState();
}
class _FlyoutFilledButtonState extends State<FlyoutFilledButton> {
final FlyoutController _controller = FlyoutController();
@override
Widget build(BuildContext context) {
return Flyout(
controller: _controller,
flyoutBuilder: widget.flyoutBuilder,
navigator: widget.navigator,
child: ElevatedButton(
onPressed: () {
_controller.show();
},
child: widget.child,
));
}
}

View File

@@ -20,6 +20,8 @@ class _MenuRoute<T> extends PopupRoute<T> {
@override
String? get barrierLabel => "menu";
double get entryHeight => App.isMobile ? 42 : 36;
@override
Widget buildPage(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) {
@@ -30,7 +32,7 @@ class _MenuRoute<T> extends PopupRoute<T> {
left = size.width - width - 10;
}
var top = location.dy;
var height = 16 + 32 * entries.length;
var height = 16 + entryHeight * entries.length;
if (top + height > size.height - 15) {
top = size.height - height - 15;
}
@@ -47,7 +49,7 @@ class _MenuRoute<T> extends PopupRoute<T> {
: null,
boxShadow: [
BoxShadow(
color: context.colorScheme.shadow.withOpacity(0.2),
color: context.colorScheme.shadow.toOpacity(0.2),
blurRadius: 8,
blurStyle: BlurStyle.outer,
),
@@ -56,7 +58,7 @@ class _MenuRoute<T> extends PopupRoute<T> {
child: BlurEffect(
borderRadius: BorderRadius.circular(4),
child: Material(
color: context.colorScheme.surface.withOpacity(0.78),
color: context.colorScheme.surface.toOpacity(0.78),
borderRadius: BorderRadius.circular(4),
child: Container(
width: width,
@@ -84,7 +86,7 @@ class _MenuRoute<T> extends PopupRoute<T> {
entry.onClick();
},
child: SizedBox(
height: App.isMobile ? 42 : 36,
height: entryHeight,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Row(

View File

@@ -563,7 +563,7 @@ class _VirtualWindowFrameState extends State<VirtualWindowFrame>
boxShadow: <BoxShadow>[
if (!_isMaximized && !_isFullScreen)
BoxShadow(
color: Colors.black.withOpacity(0.1),
color: Colors.black.toOpacity(0.1),
offset: Offset(0.0, _isFocused ? 4 : 2),
blurRadius: 6,
)

View File

@@ -1,4 +1,4 @@
part of comic_source;
part of 'comic_source.dart';
class CategoryData {
/// The title is displayed in the tab bar.

View File

@@ -1,4 +1,4 @@
library comic_source;
library;
import 'dart:async';
import 'dart:collection';

View File

@@ -198,9 +198,7 @@ class ComicDetails with HistoryMixin {
maxPage = json["maxPage"],
comments = (json["comments"] as List?)
?.map((e) => Comment.fromJson(e))
.toList(){
print(json);
}
.toList();
Map<String, dynamic> toJson() {
return {

View File

@@ -90,11 +90,10 @@ class ComicSourceParser {
var className = line1.split("class")[1].split("extends ComicSource").first;
className = className.trim();
JsEngine().runCode("""
(() => {
$js
(() => { $js
this['temp'] = new $className()
}).call()
""");
""", className);
_name = JsEngine().runCode("this['temp'].name") ??
(throw ComicSourceParseException('name is required'));
var key = JsEngine().runCode("this['temp'].key") ??

View File

@@ -42,6 +42,7 @@ class History implements Comic {
int page;
@override
String id;
/// readEpisode is a set of episode numbers that have been read.

View File

@@ -111,4 +111,10 @@ extension StyledText on TextStyle {
TextStyle get s40 => copyWith(fontSize: 40);
TextStyle withColor(Color? color) => copyWith(color: color);
}
extension ColorExt on Color {
Color toOpacity(double opacity) {
return withValues(alpha: opacity);
}
}

View File

@@ -172,7 +172,6 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
theme: ThemeData(
colorScheme: light.copyWith(
surface: Colors.white,
background: Colors.white,
),
fontFamily: App.isWindows ? "Microsoft YaHei" : null,
),
@@ -180,7 +179,6 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
darkTheme: ThemeData(
colorScheme: dark.copyWith(
surface: Colors.black,
background: Colors.black,
),
fontFamily: App.isWindows ? "Microsoft YaHei" : null,
),

View File

@@ -1,6 +1,5 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:flutter/services.dart';
@@ -281,13 +280,8 @@ class RHttpAdapter implements HttpClientAdapter {
headers[key] ??= [];
headers[key]!.add(entry.$2);
}
var data = res.body;
if (headers['content-encoding']?.contains('gzip') ?? false) {
// rhttp does not support gzip decoding
data = gzip.decoder.bind(data).map((data) => Uint8List.fromList(data));
}
return ResponseBody(
data,
res.body,
res.statusCode,
statusMessage: null,
isRedirect: false,

View File

@@ -262,7 +262,7 @@ class _CategoryPage extends StatelessWidget {
builder: (context) {
return Material(
borderRadius: const BorderRadius.all(Radius.circular(8)),
color: context.colorScheme.primaryContainer.withOpacity(0.72),
color: context.colorScheme.primaryContainer.toOpacity(0.72),
child: InkWell(
borderRadius: const BorderRadius.all(Radius.circular(8)),
onTap: () => onClick(tag, param),

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:sliver_tools/sliver_tools.dart';
import 'package:venera/components/components.dart';
import 'package:venera/foundation/app.dart';
import 'package:venera/foundation/appdata.dart';

View File

@@ -92,7 +92,7 @@ class _FavoritesPageState extends State<FavoritesPage> {
barrierDismissible: true,
fullscreenDialog: true,
opaque: false,
barrierColor: Colors.black.withOpacity(0.36),
barrierColor: Colors.black.toOpacity(0.36),
pageBuilder: (context, animation, secondary) {
return Align(
alignment: Alignment.centerLeft,

View File

@@ -592,12 +592,16 @@ class _ReorderComicsPageState extends State<_ReorderComicsPage> {
late var comics = LocalFavoritesManager().getAllComics(widget.name);
bool changed = false;
Color lightenColor(Color color, double lightenValue) {
int red = (color.red + ((255 - color.red) * lightenValue)).round();
int green = (color.green + ((255 - color.green) * lightenValue)).round();
int blue = (color.blue + ((255 - color.blue) * lightenValue)).round();
static int _floatToInt8(double x) {
return (x * 255.0).round() & 0xff;
}
return Color.fromARGB(color.alpha, red, green, blue);
Color lightenColor(Color color, double lightenValue) {
int red = (_floatToInt8(color.r) + ((255 - color.r) * lightenValue)).round();
int green = (_floatToInt8(color.g) * 255 + ((255 - color.g) * lightenValue)).round();
int blue = (_floatToInt8(color.b) * 255 + ((255 - color.b) * lightenValue)).round();
return Color.fromARGB(_floatToInt8(color.a), red, green, blue);
}
@override
@@ -650,7 +654,7 @@ class _ReorderComicsPageState extends State<_ReorderComicsPage> {
),
],
),
body: ReorderableBuilder(
body: ReorderableBuilder<FavoriteItem>(
key: reorderWidgetKey,
scrollController: _scrollController,
longPressDelay: App.isDesktop
@@ -659,14 +663,14 @@ class _ReorderComicsPageState extends State<_ReorderComicsPage> {
onReorder: (reorderFunc) {
changed = true;
setState(() {
comics = reorderFunc(comics) as List<FavoriteItem>;
comics = reorderFunc(comics);
});
widget.onReorder(comics);
},
dragChildBoxDecoration: BoxDecoration(
borderRadius: BorderRadius.circular(16),
color: lightenColor(
Theme.of(context).splashColor.withOpacity(1),
Theme.of(context).splashColor.withAlpha(255),
0.2,
),
),

View File

@@ -179,7 +179,7 @@ class _LeftBarState extends State<_LeftBar> implements FolderList {
alignment: Alignment.centerLeft,
decoration: BoxDecoration(
color: isSelected
? context.colorScheme.primaryContainer.withOpacity(0.36)
? context.colorScheme.primaryContainer.toOpacity(0.36)
: null,
border: Border(
left: BorderSide(
@@ -214,7 +214,7 @@ class _LeftBarState extends State<_LeftBar> implements FolderList {
alignment: Alignment.centerLeft,
decoration: BoxDecoration(
color: isSelected
? context.colorScheme.primaryContainer.withOpacity(0.36)
? context.colorScheme.primaryContainer.toOpacity(0.36)
: null,
border: Border(
left: BorderSide(

View File

@@ -4,8 +4,6 @@ import 'package:venera/foundation/app.dart';
import 'package:venera/foundation/comic_source/comic_source.dart';
import 'package:venera/foundation/comic_type.dart';
import 'package:venera/foundation/history.dart';
import 'package:venera/foundation/local.dart';
import 'package:venera/utils/ext.dart';
import 'package:venera/utils/translations.dart';
class HistoryPage extends StatefulWidget {

View File

@@ -6,7 +6,6 @@ import 'package:venera/foundation/comic_source/comic_source.dart';
import 'package:venera/foundation/consts.dart';
import 'package:venera/foundation/favorites.dart';
import 'package:venera/foundation/history.dart';
import 'package:venera/foundation/image_provider/cached_image.dart';
import 'package:venera/foundation/image_provider/history_image_provider.dart';
import 'package:venera/foundation/image_provider/local_comic_image.dart';
import 'package:venera/foundation/local.dart';
@@ -17,7 +16,6 @@ import 'package:venera/pages/downloading_page.dart';
import 'package:venera/pages/history_page.dart';
import 'package:venera/pages/search_page.dart';
import 'package:venera/utils/data_sync.dart';
import 'package:venera/utils/ext.dart';
import 'package:venera/utils/import_comic.dart';
import 'package:venera/utils/translations.dart';
@@ -55,7 +53,7 @@ class _SearchBar extends StatelessWidget {
width: double.infinity,
margin: const EdgeInsets.symmetric(horizontal: 8, vertical: 8),
child: Material(
color: context.colorScheme.surfaceContainer,
color: context.colorScheme.surfaceContainerHigh,
borderRadius: BorderRadius.circular(32),
child: InkWell(
borderRadius: BorderRadius.circular(32),
@@ -580,7 +578,7 @@ class _ImportComicsWidgetState extends State<_ImportComicsWidget> {
onPressed: () {
showDialog(
context: context,
barrierColor: Colors.black.withOpacity(0.2),
barrierColor: Colors.black.toOpacity(0.2),
builder: (context) {
var help = '';
help +=

View File

@@ -268,5 +268,5 @@ class _DragListener {
void Function(Offset offset)? onMove;
void Function()? onEnd;
_DragListener({this.onStart, this.onMove, this.onEnd});
_DragListener({this.onMove, this.onEnd});
}

View File

@@ -1,4 +1,4 @@
library venera_reader;
library;
import 'dart:async';
import 'dart:math' as math;
@@ -62,7 +62,7 @@ class Reader extends StatefulWidget {
final String name;
/// Map<Chapter ID, Chapter Name>.
/// key: Chapter ID, value: Chapter Name
/// null if the comic is a gallery
final Map<String, String>? chapters;

View File

@@ -167,10 +167,10 @@ class _ReaderScaffoldState extends State<_ReaderScaffold> {
child: Container(
padding: EdgeInsets.only(top: context.padding.top),
decoration: BoxDecoration(
color: context.colorScheme.surface.withOpacity(0.82),
color: context.colorScheme.surface.toOpacity(0.82),
border: Border(
bottom: BorderSide(
color: Colors.grey.withOpacity(0.5),
color: Colors.grey.toOpacity(0.5),
width: 0.5,
),
),
@@ -357,10 +357,10 @@ class _ReaderScaffoldState extends State<_ReaderScaffold> {
return BlurEffect(
child: Container(
decoration: BoxDecoration(
color: context.colorScheme.surface.withOpacity(0.82),
color: context.colorScheme.surface.toOpacity(0.82),
border: Border(
top: BorderSide(
color: Colors.grey.withOpacity(0.5),
color: Colors.grey.toOpacity(0.5),
width: 0.5,
),
),
@@ -641,7 +641,7 @@ class _ReaderScaffoldState extends State<_ReaderScaffold> {
color: Theme.of(context)
.colorScheme
.surfaceTint
.withOpacity(0.2),
.toOpacity(0.2),
child: const SizedBox.expand(),
),
),

View File

@@ -94,7 +94,7 @@ class _ExploreSettingsState extends State<ExploreSettings> {
}
class _ManageBlockingWordView extends StatefulWidget {
const _ManageBlockingWordView({super.key});
const _ManageBlockingWordView();
@override
State<_ManageBlockingWordView> createState() =>
@@ -135,7 +135,7 @@ class _ManageBlockingWordViewState extends State<_ManageBlockingWordView> {
void add() {
showDialog(
context: App.rootContext,
barrierColor: Colors.black.withOpacity(0.1),
barrierColor: Colors.black.toOpacity(0.1),
builder: (context) {
var controller = TextEditingController();
String? error;

View File

@@ -384,7 +384,7 @@ class _MultiPagesFilterState extends State<_MultiPagesFilter> {
Widget build(BuildContext context) {
var tiles = keys.map((e) => buildItem(e)).toList();
var view = ReorderableBuilder(
var view = ReorderableBuilder<String>(
key: reorderWidgetKey,
scrollController: scrollController,
longPressDelay: App.isDesktop
@@ -542,7 +542,7 @@ class _SettingPartTitle extends StatelessWidget {
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: context.colorScheme.onSurface.withOpacity(0.1),
color: context.colorScheme.onSurface.withValues(alpha: 0.1),
),
),
),

View File

@@ -267,7 +267,7 @@ class _SettingsPageState extends State<SettingsPage> implements PopEntry {
height: 46,
padding: const EdgeInsets.fromLTRB(12, 0, 12, 0),
decoration: BoxDecoration(
color: selected ? colors.primaryContainer.withOpacity(0.36) : null,
color: selected ? colors.primaryContainer.toOpacity(0.36) : null,
border: Border(
left: BorderSide(
color: selected ? colors.primary : Colors.transparent,