mirror of
https://github.com/wgh136/pixes.git
synced 2025-09-27 12:57:24 +00:00
Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
cbc69b4707 | |||
1e53e374e4 | |||
0756ebe4e5 | |||
47ebe9deec | |||
37f84efe05 | |||
6530f2c57d | |||
a3e758831b | |||
3e5ae0a39a | |||
974f739900 | |||
deb866da63 | |||
eea77b297a | |||
264c2b0e20 |
2
.github/workflows/main.yml
vendored
2
.github/workflows/main.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
channel: 'stable'
|
||||
architecture: x64
|
||||
flutter-version-file: pubspec.yaml
|
||||
- run: sudo xcode-select --switch /Applications/Xcode_14.3.1.app
|
||||
- run: sudo xcode-select --switch /Applications/Xcode_16.0.app
|
||||
- run: flutter pub get
|
||||
- run: flutter build macos --release
|
||||
- run: |
|
||||
|
@@ -4,6 +4,8 @@ plugins {
|
||||
id "dev.flutter.flutter-gradle-plugin"
|
||||
}
|
||||
|
||||
ext.abiCodes = ["armeabi-v7a": 1, "arm64-v8a": 2, "x86_64": 3]
|
||||
|
||||
def localProperties = new Properties()
|
||||
def localPropertiesFile = rootProject.file('local.properties')
|
||||
if (localPropertiesFile.exists()) {
|
||||
@@ -33,6 +35,15 @@ android {
|
||||
compileSdk flutter.compileSdkVersion
|
||||
ndkVersion flutter.ndkVersion
|
||||
|
||||
splits{
|
||||
abi {
|
||||
reset()
|
||||
include 'armeabi-v7a', 'arm64-v8a', 'x86_64'
|
||||
enable true
|
||||
universalApk true
|
||||
}
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_17
|
||||
targetCompatibility = JavaVersion.VERSION_17
|
||||
@@ -68,7 +79,25 @@ android {
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
ndk {
|
||||
abiFilters "armeabi-v7a", "arm64-v8a", "x86_64"
|
||||
}
|
||||
signingConfig signingConfigs.release
|
||||
applicationVariants.all { variant ->
|
||||
variant.outputs.all { output ->
|
||||
def abi = output.getFilter(com.android.build.OutputFile.ABI)
|
||||
if (abi != null) {
|
||||
outputFileName = "pixes-${variant.versionName}-${abi}.apk"
|
||||
def abiVersionCode = project.ext.abiCodes.get(abi)
|
||||
if (abiVersionCode != null) {
|
||||
versionCodeOverride = variant.versionCode * 10 + abiVersionCode
|
||||
}
|
||||
} else {
|
||||
outputFileName = "pixes-${variant.versionName}.apk"
|
||||
versionCodeOverride = variant.versionCode * 10
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
2
debian/gui/pixes.desktop
vendored
2
debian/gui/pixes.desktop
vendored
@@ -1,5 +1,4 @@
|
||||
[Desktop Entry]
|
||||
Version={{Version}}
|
||||
Name=Pixes
|
||||
GenericName=Pixes
|
||||
Comment=Unofficial pixiv application
|
||||
@@ -8,3 +7,4 @@ Type=Application
|
||||
Categories=Utility
|
||||
Keywords=Flutter;share;images;
|
||||
MimeType=x-scheme-handler/pixiv;
|
||||
Icon=pixes
|
@@ -152,6 +152,7 @@ abstract class MultiPageLoadingState<T extends StatefulWidget, S extends Object>
|
||||
|
||||
void firstLoad() {
|
||||
loadData(_page).then((value) {
|
||||
if (!mounted) return;
|
||||
if(value.success) {
|
||||
_page++;
|
||||
setState(() {
|
||||
|
@@ -20,6 +20,7 @@ class AppPageRoute<T> extends PageRoute<T> with _AppRouteTransitionMixin {
|
||||
super.barrierDismissible = false,
|
||||
this.enableIOSGesture = true,
|
||||
this.preventRebuild = true,
|
||||
this.isRoot = false,
|
||||
}) {
|
||||
assert(opaque);
|
||||
}
|
||||
@@ -44,6 +45,9 @@ class AppPageRoute<T> extends PageRoute<T> with _AppRouteTransitionMixin {
|
||||
@override
|
||||
final bool preventRebuild;
|
||||
|
||||
@override
|
||||
final bool isRoot;
|
||||
|
||||
static void updateBackButton() {
|
||||
Future.delayed(const Duration(milliseconds: 300), () {
|
||||
StateController.findOrNull(tag: "back_button")?.update();
|
||||
@@ -77,6 +81,8 @@ mixin _AppRouteTransitionMixin<T> on PageRoute<T> {
|
||||
|
||||
Widget? _child;
|
||||
|
||||
bool get isRoot;
|
||||
|
||||
@override
|
||||
Widget buildPage(
|
||||
BuildContext context,
|
||||
@@ -115,19 +121,44 @@ mixin _AppRouteTransitionMixin<T> on PageRoute<T> {
|
||||
@override
|
||||
Widget buildTransitions(BuildContext context, Animation<double> animation,
|
||||
Animation<double> secondaryAnimation, Widget child) {
|
||||
return DrillInPageTransition(
|
||||
animation: CurvedAnimation(
|
||||
parent: animation,
|
||||
curve: FluentTheme.of(context).animationCurve,
|
||||
),
|
||||
child: enableIOSGesture && App.isIOS
|
||||
? IOSBackGestureDetector(
|
||||
gestureWidth: _kBackGestureWidth,
|
||||
enabledCallback: () => _isPopGestureEnabled<T>(this),
|
||||
onStartPopGesture: () => _startPopGesture(this),
|
||||
child: child)
|
||||
: child,
|
||||
child = ColoredBox(
|
||||
color: FluentTheme.of(context).micaBackgroundColor,
|
||||
child: child,
|
||||
);
|
||||
|
||||
if (isRoot) {
|
||||
child = EntrancePageTransition(
|
||||
animation: CurvedAnimation(
|
||||
parent: animation,
|
||||
curve: FluentTheme.of(context).animationCurve,
|
||||
),
|
||||
child: enableIOSGesture && App.isIOS
|
||||
? IOSBackGestureDetector(
|
||||
gestureWidth: _kBackGestureWidth,
|
||||
enabledCallback: () => _isPopGestureEnabled<T>(this),
|
||||
onStartPopGesture: () => _startPopGesture(this),
|
||||
child: child)
|
||||
: child,
|
||||
);
|
||||
} else {
|
||||
child = DrillInPageTransition(
|
||||
animation: CurvedAnimation(
|
||||
parent: animation,
|
||||
curve: FluentTheme
|
||||
.of(context)
|
||||
.animationCurve,
|
||||
),
|
||||
child: enableIOSGesture && App.isIOS
|
||||
? IOSBackGestureDetector(
|
||||
gestureWidth: _kBackGestureWidth,
|
||||
enabledCallback: () => _isPopGestureEnabled<T>(this),
|
||||
onStartPopGesture: () => _startPopGesture(this),
|
||||
child: child)
|
||||
: child,
|
||||
);
|
||||
}
|
||||
|
||||
return child;
|
||||
}
|
||||
|
||||
IOSBackGestureController _startPopGesture(PageRoute<T> route) {
|
||||
@@ -388,3 +419,32 @@ class SideBarRoute<T> extends PopupRoute<T> {
|
||||
return IOSBackGestureController(route.controller!, route.navigator!);
|
||||
}
|
||||
}
|
||||
|
||||
class EntrancePageTransition extends StatelessWidget {
|
||||
/// Creates an entrance page transition
|
||||
const EntrancePageTransition({
|
||||
super.key,
|
||||
required this.child,
|
||||
required this.animation,
|
||||
});
|
||||
|
||||
/// The widget to be animated
|
||||
final Widget child;
|
||||
|
||||
/// The animation to drive this transition
|
||||
final Animation<double> animation;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SlideTransition(
|
||||
position: Tween<Offset>(
|
||||
begin: const Offset(0, 0.1),
|
||||
end: Offset.zero,
|
||||
).animate(animation),
|
||||
child: FadeTransition(
|
||||
opacity: animation,
|
||||
child: child,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -35,15 +35,15 @@ extension NovelExt on Network {
|
||||
return getNovelsWithNextUrl(url);
|
||||
}
|
||||
|
||||
Future<Res<List<Novel>>> getBookmarkedNovels(String uid) {
|
||||
Future<Res<List<Novel>>> getBookmarkedNovels(String uid, bool public) {
|
||||
return getNovelsWithNextUrl(
|
||||
"/v1/user/bookmarks/novel?user_id=$uid&restrict=public");
|
||||
"/v1/user/bookmarks/novel?user_id=$uid&restrict=${public ? "public" : "private"}");
|
||||
}
|
||||
|
||||
Future<Res<bool>> favoriteNovel(String id) async {
|
||||
Future<Res<bool>> favoriteNovel(String id, bool public) async {
|
||||
var res = await apiPost("/v2/novel/bookmark/add", data: {
|
||||
"novel_id": id,
|
||||
"restrict": "public",
|
||||
"restrict": public ? "public" : "private",
|
||||
});
|
||||
if (res.error) {
|
||||
return Res.fromErrorRes(res);
|
||||
@@ -149,4 +149,17 @@ extension NovelExt on Network {
|
||||
}
|
||||
return Res(Novel.fromJson(res.data["novel"]));
|
||||
}
|
||||
|
||||
Future<Res<List<Novel>>> getFollowingNovels(String restrict,
|
||||
[String? nextUrl]) async {
|
||||
var res = await apiGet(nextUrl ?? "/v1/novel/follow?restrict=$restrict");
|
||||
if (res.success) {
|
||||
return Res(
|
||||
(res.data["novels"] as List).map((e) => Novel.fromJson(e)).toList(),
|
||||
subData: res.data["next_url"],
|
||||
);
|
||||
} else {
|
||||
return Res.error(res.errorMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
83
lib/pages/following_novels_page.dart
Normal file
83
lib/pages/following_novels_page.dart
Normal file
@@ -0,0 +1,83 @@
|
||||
import 'package:fluent_ui/fluent_ui.dart';
|
||||
import 'package:pixes/components/grid.dart';
|
||||
import 'package:pixes/components/loading.dart';
|
||||
import 'package:pixes/components/novel.dart';
|
||||
import 'package:pixes/components/segmented_button.dart';
|
||||
import 'package:pixes/components/title_bar.dart';
|
||||
import 'package:pixes/foundation/widget_utils.dart';
|
||||
import 'package:pixes/network/network.dart';
|
||||
import 'package:pixes/utils/translation.dart';
|
||||
|
||||
class FollowingNovelsPage extends StatefulWidget {
|
||||
const FollowingNovelsPage({super.key});
|
||||
|
||||
@override
|
||||
State<FollowingNovelsPage> createState() => _FollowingNovelsPageState();
|
||||
}
|
||||
|
||||
class _FollowingNovelsPageState
|
||||
extends MultiPageLoadingState<FollowingNovelsPage, Novel> {
|
||||
bool public = true;
|
||||
|
||||
@override
|
||||
Widget? buildFrame(BuildContext context, Widget child) {
|
||||
return Column(
|
||||
children: [
|
||||
TitleBar(
|
||||
title: "Following".tl,
|
||||
action: SegmentedButton(
|
||||
options: [
|
||||
SegmentedButtonOption("public", "Public".tl),
|
||||
SegmentedButtonOption("private", "Private".tl),
|
||||
],
|
||||
onPressed: (key) {
|
||||
var newPublic = key == "public";
|
||||
if (newPublic != public) {
|
||||
public = newPublic;
|
||||
nextUrl = null;
|
||||
reset();
|
||||
}
|
||||
},
|
||||
value: public ? "public" : "private",
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: child,
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget buildContent(BuildContext context, List<Novel> data) {
|
||||
return Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: GridViewWithFixedItemHeight(
|
||||
itemCount: data.length,
|
||||
itemHeight: 164,
|
||||
minCrossAxisExtent: 400,
|
||||
builder: (context, index) {
|
||||
if (index == data.length - 1) {
|
||||
nextPage();
|
||||
}
|
||||
return NovelWidget(data[index]);
|
||||
},
|
||||
).paddingHorizontal(8),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
String? nextUrl;
|
||||
|
||||
@override
|
||||
Future<Res<List<Novel>>> loadData(int page) async {
|
||||
if (nextUrl == "end") return Res.error("No more data");
|
||||
var res = nextUrl == null
|
||||
? await Network().getFollowingNovels(public ? "public" : "private")
|
||||
: await Network().getNovelsWithNextUrl(nextUrl!);
|
||||
nextUrl = res.subData ?? "end";
|
||||
return res;
|
||||
}
|
||||
}
|
@@ -11,6 +11,7 @@ import "package:pixes/network/network.dart";
|
||||
import "package:pixes/pages/bookmarks.dart";
|
||||
import "package:pixes/pages/downloaded_page.dart";
|
||||
import "package:pixes/pages/following_artworks.dart";
|
||||
import "package:pixes/pages/following_novels_page.dart";
|
||||
import "package:pixes/pages/history.dart";
|
||||
import "package:pixes/pages/novel_bookmarks_page.dart";
|
||||
import "package:pixes/pages/novel_ranking_page.dart";
|
||||
@@ -132,112 +133,117 @@ class _MainPageState extends State<MainPage>
|
||||
return DefaultSelectionStyle.merge(
|
||||
selectionColor: FluentTheme.of(context).selectionColor.toOpacity(0.4),
|
||||
child: NavigationView(
|
||||
appBar: buildAppBar(context, navigatorKey),
|
||||
pane: NavigationPane(
|
||||
selected: index,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
index = value;
|
||||
});
|
||||
navigate(value);
|
||||
},
|
||||
items: [
|
||||
UserPane(),
|
||||
PaneItem(
|
||||
icon: const Icon(
|
||||
MdIcons.search,
|
||||
size: 20,
|
||||
),
|
||||
title: Text('Search'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
appBar: buildAppBar(context, navigatorKey),
|
||||
pane: NavigationPane(
|
||||
selected: index,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
index = value;
|
||||
});
|
||||
navigate(value);
|
||||
},
|
||||
items: [
|
||||
UserPane(),
|
||||
PaneItem(
|
||||
icon: const Icon(
|
||||
MdIcons.search,
|
||||
size: 20,
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(
|
||||
MdIcons.downloading,
|
||||
size: 20,
|
||||
),
|
||||
title: Text('Downloading'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
title: Text('Search'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(
|
||||
MdIcons.downloading,
|
||||
size: 20,
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(
|
||||
MdIcons.download,
|
||||
size: 20,
|
||||
),
|
||||
title: Text('Downloaded'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
title: Text('Downloading'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(
|
||||
MdIcons.download,
|
||||
size: 20,
|
||||
),
|
||||
PaneItemSeparator(),
|
||||
PaneItemHeader(
|
||||
header: Text('${"Illustrations".tl}/${"Manga".tl}')
|
||||
.paddingBottom(4)
|
||||
.paddingLeft(8)),
|
||||
PaneItem(
|
||||
icon: const Icon(
|
||||
MdIcons.explore_outlined,
|
||||
size: 20,
|
||||
),
|
||||
title: Text('Explore'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
title: Text('Downloaded'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItemSeparator(),
|
||||
PaneItemHeader(
|
||||
header: Text('${"Illustrations".tl}/${"Manga".tl}')
|
||||
.paddingBottom(4)
|
||||
.paddingLeft(8)),
|
||||
PaneItem(
|
||||
icon: const Icon(
|
||||
MdIcons.explore_outlined,
|
||||
size: 20,
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.bookmark_outline, size: 20),
|
||||
title: Text('Bookmarks'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.interests_outlined, size: 20),
|
||||
title: Text('Following'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.history, size: 20),
|
||||
title: Text('History'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.leaderboard_outlined, size: 20),
|
||||
title: Text('Ranking'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItemSeparator(),
|
||||
PaneItemHeader(
|
||||
header: Text("Novel".tl).paddingBottom(4).paddingLeft(8)),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.featured_play_list_outlined, size: 20),
|
||||
title: Text('Recommendation'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon:
|
||||
const Icon(MdIcons.collections_bookmark_outlined, size: 20),
|
||||
title: Text('Bookmarks'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.leaderboard_outlined, size: 20),
|
||||
title: Text('Ranking'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItemSeparator(),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.settings_outlined, size: 20),
|
||||
title: Text('Settings'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
],
|
||||
title: Text('Explore'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.bookmark_outline, size: 20),
|
||||
title: Text('Bookmarks'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.interests_outlined, size: 20),
|
||||
title: Text('Following'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.history, size: 20),
|
||||
title: Text('History'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.leaderboard_outlined, size: 20),
|
||||
title: Text('Ranking'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItemSeparator(),
|
||||
PaneItemHeader(
|
||||
header: Text("Novel".tl).paddingBottom(4).paddingLeft(8)),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.featured_play_list_outlined, size: 20),
|
||||
title: Text('Recommendation'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.collections_bookmark_outlined, size: 20),
|
||||
title: Text('Bookmarks'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.interests_outlined, size: 20),
|
||||
title: Text('Following'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.leaderboard_outlined, size: 20),
|
||||
title: Text('Ranking'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
PaneItemSeparator(),
|
||||
PaneItem(
|
||||
icon: const Icon(MdIcons.settings_outlined, size: 20),
|
||||
title: Text('Settings'.tl),
|
||||
body: const SizedBox.shrink(),
|
||||
),
|
||||
],
|
||||
),
|
||||
paneBodyBuilder: (pane, child) => MediaQuery.removePadding(
|
||||
context: context,
|
||||
removeTop: true,
|
||||
child: Navigator(
|
||||
key: navigatorKey,
|
||||
onGenerateRoute: (settings) => AppPageRoute(
|
||||
isRoot: true,
|
||||
builder: (context) => pageBuilders.elementAtOrNull(index)!(),
|
||||
),
|
||||
),
|
||||
paneBodyBuilder: (pane, child) => MediaQuery.removePadding(
|
||||
context: context,
|
||||
removeTop: true,
|
||||
child: Navigator(
|
||||
key: navigatorKey,
|
||||
onGenerateRoute: (settings) => AppPageRoute(
|
||||
builder: (context) =>
|
||||
pageBuilders.elementAtOrNull(index)!(),
|
||||
),
|
||||
),
|
||||
)),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -253,6 +259,7 @@ class _MainPageState extends State<MainPage>
|
||||
() => const RankingPage(),
|
||||
() => const NovelRecommendationPage(),
|
||||
() => const NovelBookmarksPage(),
|
||||
() => const FollowingNovelsPage(),
|
||||
() => const NovelRankingPage(),
|
||||
() => const SettingsPage(),
|
||||
];
|
||||
@@ -263,7 +270,12 @@ class _MainPageState extends State<MainPage>
|
||||
child: Text("Invalid Page: $index"),
|
||||
);
|
||||
navigatorKey.currentState!.pushAndRemoveUntil(
|
||||
AppPageRoute(builder: (context) => page()), (route) => false);
|
||||
AppPageRoute(
|
||||
builder: (context) => page(),
|
||||
isRoot: true,
|
||||
),
|
||||
(route) => false,
|
||||
);
|
||||
}
|
||||
|
||||
NavigationAppBar buildAppBar(
|
||||
|
@@ -3,6 +3,7 @@ import 'package:pixes/appdata.dart';
|
||||
import 'package:pixes/components/grid.dart';
|
||||
import 'package:pixes/components/loading.dart';
|
||||
import 'package:pixes/components/novel.dart';
|
||||
import 'package:pixes/components/segmented_button.dart';
|
||||
import 'package:pixes/components/title_bar.dart';
|
||||
import 'package:pixes/foundation/widget_utils.dart';
|
||||
import 'package:pixes/network/network.dart';
|
||||
@@ -17,11 +18,41 @@ class NovelBookmarksPage extends StatefulWidget {
|
||||
|
||||
class _NovelBookmarksPageState
|
||||
extends MultiPageLoadingState<NovelBookmarksPage, Novel> {
|
||||
bool public = true;
|
||||
|
||||
@override
|
||||
Widget? buildFrame(BuildContext context, Widget child) {
|
||||
return Column(
|
||||
children: [
|
||||
TitleBar(
|
||||
title: "Bookmarks".tl,
|
||||
action: SegmentedButton(
|
||||
options: [
|
||||
SegmentedButtonOption("public", "Public".tl),
|
||||
SegmentedButtonOption("private", "Private".tl),
|
||||
],
|
||||
onPressed: (key) {
|
||||
var newPublic = key == "public";
|
||||
if (newPublic != public) {
|
||||
public = newPublic;
|
||||
nextUrl = null;
|
||||
reset();
|
||||
}
|
||||
},
|
||||
value: public ? "public" : "private",
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: child,
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget buildContent(BuildContext context, List<Novel> data) {
|
||||
return Column(
|
||||
children: [
|
||||
TitleBar(title: "Bookmarks".tl),
|
||||
Expanded(
|
||||
child: GridViewWithFixedItemHeight(
|
||||
itemCount: data.length,
|
||||
@@ -45,7 +76,7 @@ class _NovelBookmarksPageState
|
||||
Future<Res<List<Novel>>> loadData(int page) async {
|
||||
if (nextUrl == "end") return Res.error("No more data");
|
||||
var res = nextUrl == null
|
||||
? await Network().getBookmarkedNovels(appdata.account!.user.id)
|
||||
? await Network().getBookmarkedNovels(appdata.account!.user.id, public)
|
||||
: await Network().getNovelsWithNextUrl(nextUrl!);
|
||||
nextUrl = res.subData ?? "end";
|
||||
return res;
|
||||
|
@@ -121,18 +121,18 @@ class _NovelPageState extends State<NovelPage> {
|
||||
padding: const EdgeInsets.only(bottom: 10),
|
||||
child: Row(
|
||||
children: [
|
||||
const SizedBox(
|
||||
width: 2,
|
||||
),
|
||||
const SizedBox(width: 2),
|
||||
Expanded(
|
||||
child: Container(
|
||||
height: 68,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: ColorScheme.of(context).outlineVariant,
|
||||
width: 0.6),
|
||||
borderRadius: BorderRadius.circular(4)),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
|
||||
border: Border.all(
|
||||
color: ColorScheme.of(context).outlineVariant,
|
||||
width: 0.6,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
|
||||
child: Row(
|
||||
children: [
|
||||
Column(
|
||||
@@ -148,31 +148,31 @@ class _NovelPageState extends State<NovelPage> {
|
||||
)
|
||||
],
|
||||
),
|
||||
const SizedBox(
|
||||
width: 12,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Text(
|
||||
widget.novel.totalViews.toString(),
|
||||
style: TextStyle(
|
||||
color: ColorScheme.of(context).primary,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 18),
|
||||
color: ColorScheme.of(context).primary,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 18,
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 16,
|
||||
),
|
||||
const SizedBox(width: 16),
|
||||
Expanded(
|
||||
child: Container(
|
||||
height: 68,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: ColorScheme.of(context).outlineVariant, width: 0.6),
|
||||
borderRadius: BorderRadius.circular(4)),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
|
||||
border: Border.all(
|
||||
color: ColorScheme.of(context).outlineVariant,
|
||||
width: 0.6,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
|
||||
child: Row(
|
||||
children: [
|
||||
Column(
|
||||
@@ -188,22 +188,19 @@ class _NovelPageState extends State<NovelPage> {
|
||||
)
|
||||
],
|
||||
),
|
||||
const SizedBox(
|
||||
width: 12,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Text(
|
||||
widget.novel.totalBookmarks.toString(),
|
||||
style: TextStyle(
|
||||
color: ColorScheme.of(context).primary,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 18),
|
||||
color: ColorScheme.of(context).primary,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 18,
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
)),
|
||||
const SizedBox(
|
||||
width: 2,
|
||||
),
|
||||
const SizedBox(width: 2),
|
||||
],
|
||||
),
|
||||
);
|
||||
@@ -241,25 +238,30 @@ class _NovelPageState extends State<NovelPage> {
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text(widget.novel.author.name,
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text(
|
||||
widget.novel.author.name,
|
||||
style: const TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.bold,
|
||||
)),
|
||||
Text(
|
||||
widget.novel.createDate.toString().substring(0, 10),
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
color: ColorScheme.of(context).outline,
|
||||
),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
],
|
||||
Text(
|
||||
widget.novel.createDate.toString().substring(0, 10),
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
color: ColorScheme.of(context).outline,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const Spacer(),
|
||||
const Icon(MdIcons.chevron_right)
|
||||
],
|
||||
),
|
||||
@@ -271,15 +273,44 @@ class _NovelPageState extends State<NovelPage> {
|
||||
|
||||
bool isAddingFavorite = false;
|
||||
|
||||
var favoriteFlyout = FlyoutController();
|
||||
|
||||
Widget buildActions() {
|
||||
void favorite() async {
|
||||
if (isAddingFavorite) return;
|
||||
bool? public;
|
||||
if (!widget.novel.isBookmarked) {
|
||||
await favoriteFlyout.showFlyout(
|
||||
navigatorKey: App.rootNavigatorKey.currentState!,
|
||||
builder: (context) {
|
||||
return MenuFlyout(
|
||||
items: [
|
||||
MenuFlyoutItem(
|
||||
text: Text("Public".tl),
|
||||
onPressed: () {
|
||||
public = true;
|
||||
},
|
||||
),
|
||||
MenuFlyoutItem(
|
||||
text: Text("Private".tl),
|
||||
onPressed: () {
|
||||
public = false;
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
if (public == null) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
setState(() {
|
||||
isAddingFavorite = true;
|
||||
});
|
||||
var res = widget.novel.isBookmarked
|
||||
? await Network().deleteFavoriteNovel(widget.novel.id.toString())
|
||||
: await Network().favoriteNovel(widget.novel.id.toString());
|
||||
: await Network().favoriteNovel(widget.novel.id.toString(), public!);
|
||||
if (res.error) {
|
||||
if (mounted) {
|
||||
context.showToast(message: res.errorMessage ?? "Network Error");
|
||||
@@ -337,38 +368,41 @@ class _NovelPageState extends State<NovelPage> {
|
||||
context.to(() => NovelReadingPage(widget.novel));
|
||||
}),
|
||||
const SizedBox(width: 16),
|
||||
Button(
|
||||
onPressed: favorite,
|
||||
child: Row(
|
||||
mainAxisAlignment: constrains.maxWidth > 420
|
||||
? MainAxisAlignment.start
|
||||
: MainAxisAlignment.center,
|
||||
children: [
|
||||
if (isAddingFavorite)
|
||||
const SizedBox(
|
||||
width: 18,
|
||||
height: 18,
|
||||
child: ProgressRing(
|
||||
strokeWidth: 2,
|
||||
),
|
||||
)
|
||||
else if (widget.novel.isBookmarked)
|
||||
Icon(
|
||||
MdIcons.favorite,
|
||||
size: 18,
|
||||
color: ColorScheme.of(context).error,
|
||||
)
|
||||
else
|
||||
const Icon(MdIcons.favorite_outline, size: 18),
|
||||
if (constrains.maxWidth > 420)
|
||||
const SizedBox(width: 12),
|
||||
if (constrains.maxWidth > 420) Text("Favorite".tl)
|
||||
],
|
||||
)
|
||||
.fixWidth(shouldFillSpace
|
||||
? width / 4 - 4 - kFluentButtonPadding
|
||||
: 64)
|
||||
.fixHeight(32),
|
||||
FlyoutTarget(
|
||||
controller: favoriteFlyout,
|
||||
child: Button(
|
||||
onPressed: favorite,
|
||||
child: Row(
|
||||
mainAxisAlignment: constrains.maxWidth > 420
|
||||
? MainAxisAlignment.start
|
||||
: MainAxisAlignment.center,
|
||||
children: [
|
||||
if (isAddingFavorite)
|
||||
const SizedBox(
|
||||
width: 18,
|
||||
height: 18,
|
||||
child: ProgressRing(
|
||||
strokeWidth: 2,
|
||||
),
|
||||
)
|
||||
else if (widget.novel.isBookmarked)
|
||||
Icon(
|
||||
MdIcons.favorite,
|
||||
size: 18,
|
||||
color: ColorScheme.of(context).error,
|
||||
)
|
||||
else
|
||||
const Icon(MdIcons.favorite_outline, size: 18),
|
||||
if (constrains.maxWidth > 420)
|
||||
const SizedBox(width: 12),
|
||||
if (constrains.maxWidth > 420) Text("Favorite".tl)
|
||||
],
|
||||
)
|
||||
.fixWidth(shouldFillSpace
|
||||
? width / 4 - 4 - kFluentButtonPadding
|
||||
: 64)
|
||||
.fixHeight(32),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Button(
|
||||
|
@@ -209,7 +209,7 @@ class _SettingsPageState extends State<SettingsPage> {
|
||||
MdIcons.open_in_new,
|
||||
size: 18,
|
||||
),
|
||||
onPressed: () => launchUrlString("https://t.me/pica_group"),
|
||||
onPressed: () => launchUrlString("https://t.me/venera_dev"),
|
||||
)),
|
||||
buildItem(
|
||||
title: "Logs",
|
||||
|
117
pubspec.lock
117
pubspec.lock
@@ -149,18 +149,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: ffi
|
||||
sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
|
||||
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
version: "2.1.3"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file
|
||||
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
|
||||
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.0"
|
||||
version: "7.0.1"
|
||||
file_selector:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -173,34 +173,34 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_android
|
||||
sha256: "57265ec9591e8fd8508f613544cde6f7d045731f6b09644057e49a4c9c672b7c"
|
||||
sha256: "98ac58e878b05ea2fdb204e7f4fc4978d90406c9881874f901428e01d3b18fbc"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.5.1+1"
|
||||
version: "0.5.1+12"
|
||||
file_selector_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_ios
|
||||
sha256: "7160121e434910ec23717bde3a0c514ca039e8c97b791ff35d1786da38abcb4a"
|
||||
sha256: "94b98ad950b8d40d96fee8fa88640c2e4bd8afcdd4817993bd04e20310f45420"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.5.2"
|
||||
version: "0.5.3+1"
|
||||
file_selector_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_linux
|
||||
sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492"
|
||||
sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.2+1"
|
||||
version: "0.9.3+2"
|
||||
file_selector_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_macos
|
||||
sha256: f42eacb83b318e183b1ae24eead1373ab1334084404c8c16e0354f9a3e55d385
|
||||
sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.4"
|
||||
version: "0.9.4+2"
|
||||
file_selector_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -221,18 +221,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file_selector_windows
|
||||
sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0
|
||||
sha256: "8f5d2f6590d51ecd9179ba39c64f722edc15226cc93dcc8698466ad36a4a85a4"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.3+1"
|
||||
version: "0.9.3+3"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fixnum
|
||||
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
|
||||
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
version: "1.1.1"
|
||||
fluent_ui:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -291,12 +291,11 @@ packages:
|
||||
flutter_to_arch:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
path: "."
|
||||
ref: "15bfead"
|
||||
resolved-ref: "15bfead0380fda79b0256b37c73b886b0882f1bf"
|
||||
url: "https://github.com/wgh136/flutter_to_arch"
|
||||
source: git
|
||||
version: "1.0.0"
|
||||
name: flutter_to_arch
|
||||
sha256: b68b2757a89a517ae2141cbc672acdd1f69721dd686cacad03876b6f436ff040
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
flutter_web_plugins:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
@@ -322,10 +321,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_parser
|
||||
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
|
||||
sha256: "76d306a1c3afb33fe82e2bbacad62a61f409b5634c915fceb0d799de1a913360"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.2"
|
||||
version: "4.1.1"
|
||||
image_gallery_saver:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -347,10 +346,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: io
|
||||
sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
|
||||
sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
version: "1.0.5"
|
||||
json_annotation:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -411,10 +410,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: math_expressions
|
||||
sha256: db0b72d867491c4e53a1c773e2708d5d6e94bbe06be07080fc9f896766b9cd3d
|
||||
sha256: e32d803d758ace61cc6c4bdfed1226ff60a6a23646b35685670d28b5616139f8
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.0"
|
||||
version: "2.6.0"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -427,10 +426,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mime
|
||||
sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2"
|
||||
sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.5"
|
||||
version: "2.0.0"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -459,10 +458,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_foundation
|
||||
sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
|
||||
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.0"
|
||||
version: "2.4.1"
|
||||
path_provider_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -483,16 +482,16 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_windows
|
||||
sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
|
||||
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.1"
|
||||
version: "2.3.0"
|
||||
photo_view:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
path: "."
|
||||
ref: main
|
||||
resolved-ref: "97de36fa8c500c18037f675c122785b193559e09"
|
||||
resolved-ref: "94724a0b7f94167fd1ae061f84e14ae04cae5c39"
|
||||
url: "https://github.com/wgh136/photo_view"
|
||||
source: git
|
||||
version: "0.14.0"
|
||||
@@ -500,10 +499,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: platform
|
||||
sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
|
||||
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.4"
|
||||
version: "3.1.6"
|
||||
plugin_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -625,10 +624,10 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: sqlite3_flutter_libs
|
||||
sha256: fb2a106a2ea6042fe57de2c47074cc31539a941819c91e105b864744605da3f5
|
||||
sha256: "636b0fe8a2de894e5455572f6cbbc458f4ffecfe9f860b79439e27041ea4f0b9"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.5.21"
|
||||
version: "0.5.27"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -673,10 +672,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
|
||||
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.2"
|
||||
version: "1.4.0"
|
||||
url_launcher:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -689,34 +688,34 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_android
|
||||
sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775"
|
||||
sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.1"
|
||||
version: "6.3.14"
|
||||
url_launcher_ios:
|
||||
dependency: transitive
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: url_launcher_ios
|
||||
sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89"
|
||||
sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.0"
|
||||
version: "6.3.2"
|
||||
url_launcher_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_linux
|
||||
sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811
|
||||
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.1"
|
||||
version: "3.2.1"
|
||||
url_launcher_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_macos
|
||||
sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de"
|
||||
sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.0"
|
||||
version: "3.2.2"
|
||||
url_launcher_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -745,10 +744,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: uuid
|
||||
sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8"
|
||||
sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.4.0"
|
||||
version: "4.5.1"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -809,18 +808,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: win32
|
||||
sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a"
|
||||
sha256: "8b338d4486ab3fbc0ba0db9f9b4f5239b6697fcee427939a40e720cbb9ee0a69"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.5.4"
|
||||
version: "5.9.0"
|
||||
win32_registry:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: win32_registry
|
||||
sha256: "10589e0d7f4e053f2c61023a31c9ce01146656a70b7b7f0828c0b46d7da2a9bb"
|
||||
sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.3"
|
||||
version: "1.1.5"
|
||||
window_manager:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -833,10 +832,10 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: xdg_directories
|
||||
sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
|
||||
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
version: "1.1.0"
|
||||
yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -847,4 +846,4 @@ packages:
|
||||
version: "3.1.2"
|
||||
sdks:
|
||||
dart: ">=3.5.0 <4.0.0"
|
||||
flutter: ">=3.27.0"
|
||||
flutter: ">=3.27.3"
|
||||
|
@@ -20,7 +20,7 @@ version: 1.1.0+110
|
||||
|
||||
environment:
|
||||
sdk: '>=3.3.4 <4.0.0'
|
||||
flutter: 3.27.0
|
||||
flutter: 3.27.3
|
||||
|
||||
# Dependencies specify other packages that your package needs in order to work.
|
||||
# To automatically upgrade your package dependencies to the latest versions
|
||||
@@ -43,6 +43,7 @@ dependencies:
|
||||
intl:
|
||||
path_provider: ^2.1.5
|
||||
url_launcher: ^6.3.1
|
||||
url_launcher_ios: ^6.3.2
|
||||
app_links: ^6.3.3
|
||||
win32_registry: ^1.1.0
|
||||
flutter_staggered_grid_view: ^0.7.0
|
||||
@@ -73,10 +74,7 @@ dev_dependencies:
|
||||
# package. See that file for information about deactivating specific lint
|
||||
# rules and activating additional ones.
|
||||
flutter_lints: ^3.0.0
|
||||
flutter_to_arch:
|
||||
git:
|
||||
url: https://github.com/wgh136/flutter_to_arch
|
||||
ref: 15bfead
|
||||
flutter_to_arch: ^1.0.1
|
||||
|
||||
# For information on the generic Dart part of this file, see the
|
||||
# following page: https://dart.dev/tools/pub/pubspec
|
||||
|
@@ -46,7 +46,7 @@ Source: "{#RootPath}\build\windows\x64\runner\Release\app_links_plugin.dll"; Des
|
||||
Source: "{#RootPath}\build\windows\x64\runner\Release\dynamic_color_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "{#RootPath}\build\windows\x64\runner\Release\file_selector_windows_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "{#RootPath}\build\windows\x64\runner\Release\flutter_windows.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "{#RootPath}\build\windows\x64\runner\Release\screen_retriever_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "{#RootPath}\build\windows\x64\runner\Release\screen_retriever_windows_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "{#RootPath}\build\windows\x64\runner\Release\share_plus_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "{#RootPath}\build\windows\x64\runner\Release\sqlite3.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "{#RootPath}\build\windows\x64\runner\Release\sqlite3_flutter_libs_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
Reference in New Issue
Block a user