Compare commits

..

6 Commits

Author SHA1 Message Date
8e9f0eb1b8 v1.1.1+32
All checks were successful
Flutter Schmutter / build (push) Successful in 6m13s
2025-06-06 19:26:53 +02:00
f083fc8e8f ic_launcher_round 2025-06-06 18:32:59 +02:00
9a716018fc v1.1.1+31
All checks were successful
Flutter Schmutter / build (push) Successful in 3m28s
- fix share
- logo
2025-06-06 14:03:06 +02:00
f1eb52518b v1.1.0+30
All checks were successful
Flutter Schmutter / build (push) Successful in 3m27s
2025-06-06 12:58:21 +02:00
c7d996a402 v1.0.29+29
All checks were successful
Flutter Schmutter / build (push) Successful in 3m28s
2025-06-06 11:29:01 +02:00
ee93ef576b xd 2025-06-06 10:10:40 +02:00
19 changed files with 377 additions and 70 deletions

View File

@ -4,7 +4,9 @@
<application <application
android:label="f0ckapp" android:label="f0ckapp"
android:name="${applicationName}" android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"> android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:enableOnBackInvokedCallback="true">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -34,6 +34,7 @@ class MediaItem {
String get thumbnailUrl => 'https://f0ck.me/t/$id.webp'; String get thumbnailUrl => 'https://f0ck.me/t/$id.webp';
String get mediaUrl => 'https://f0ck.me/b/$dest'; String get mediaUrl => 'https://f0ck.me/b/$dest';
String get coverUrl => 'https://f0ck.me/ca/$id.webp'; String get coverUrl => 'https://f0ck.me/ca/$id.webp';
String get postUrl => 'https://f0ck.me/$id';
} }
class Tag { class Tag {

View File

@ -22,25 +22,26 @@ class MediaProvider extends ChangeNotifier {
int get crossAxisCount => _crossAxisCount; int get crossAxisCount => _crossAxisCount;
List<MediaItem> get mediaItems => _mediaItems; List<MediaItem> get mediaItems => _mediaItems;
bool get isLoading => _isLoading; bool get isLoading => _isLoading;
Function get resetMedia => _resetMedia;
void setType(String type) { void setType(String type) {
_typeid = types.indexOf(type); _typeid = types.indexOf(type);
loadMedia(reload: true); _resetMedia();
} }
void setMode(int mode) { void setMode(int mode) {
_mode = mode; _mode = mode;
loadMedia(reload: true); _resetMedia();
} }
void toggleRandom() { void toggleRandom() {
_random = !_random; _random = !_random;
loadMedia(reload: true); _resetMedia();
} }
void setTag(String? tag) { void setTag(String? tag) {
_tag = tag; _tag = tag;
loadMedia(reload: true); _resetMedia();
} }
void setCrossAxisCount(int crossAxisCount) { void setCrossAxisCount(int crossAxisCount) {
@ -50,7 +51,8 @@ class MediaProvider extends ChangeNotifier {
void setMediaItems(List<MediaItem> mediaItems) { void setMediaItems(List<MediaItem> mediaItems) {
if (_mediaItems != mediaItems) { if (_mediaItems != mediaItems) {
_mediaItems = mediaItems; _mediaItems.clear();
_mediaItems.addAll(mediaItems);
notifyListeners(); notifyListeners();
} }
} }
@ -60,30 +62,34 @@ class MediaProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
Future<void> loadMedia({bool reload = false, bool notify = true}) async { void _resetMedia() {
_mediaItems.clear();
notifyListeners();
loadMedia();
}
Future<void> loadMedia({bool notify = true}) async {
if (_isLoading) return; if (_isLoading) return;
_isLoading = true; _isLoading = true;
if (notify) notifyListeners(); if (notify) notifyListeners();
try { try {
final newMedia = await fetchMedia( final newMedia = await fetchMedia(
older: reload older: _mediaItems.isNotEmpty ? _mediaItems.last.id : null,
? null
: _mediaItems.isNotEmpty
? _mediaItems.last.id
: null,
type: type, type: type,
mode: mode, mode: mode,
random: random, random: random,
tag: tag, tag: tag,
); );
reload ? setMediaItems(newMedia) : addMediaItems(newMedia); if(_mediaItems != newMedia) {
addMediaItems(newMedia);
if (notify) notifyListeners();
}
} catch (e) { } catch (e) {
debugPrint('Fehler beim Laden der Medien: $e'); debugPrint('Fehler beim Laden der Medien: $e');
} finally { } finally {
_isLoading = false; _isLoading = false;
if(notify) notifyListeners();
} }
} }
} }

View File

@ -1,3 +1,6 @@
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -8,6 +11,7 @@ import 'package:f0ckapp/utils/SmartRefreshIndicator.dart';
import 'package:f0ckapp/utils/PageTransformer.dart'; import 'package:f0ckapp/utils/PageTransformer.dart';
import 'package:f0ckapp/providers/MediaProvider.dart'; import 'package:f0ckapp/providers/MediaProvider.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:share_plus/share_plus.dart';
class DetailView extends StatefulWidget { class DetailView extends StatefulWidget {
final int initialItemId; final int initialItemId;
@ -36,9 +40,7 @@ class _DetailViewState extends State<DetailView> {
_currentIndex = initialIndex; _currentIndex = initialIndex;
_pageController.addListener(() { _pageController.addListener(() {
setState(() { setState(() => _currentIndex = _pageController.page?.round() ?? 0);
_currentIndex = _pageController.page?.round() ?? 0;
});
}); });
_preloadAdjacentMedia(initialIndex); _preloadAdjacentMedia(initialIndex);
@ -99,7 +101,59 @@ class _DetailViewState extends State<DetailView> {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
centerTitle: true, centerTitle: true,
title: Text('f0ck #${widget.initialItemId} (${provider.type})'), title: Text(
'f0ck #${provider.mediaItems.elementAt(_currentIndex).id.toString()}',
),
actions: [
PopupMenuButton<String>(
onSelected: (value) async {
final item = provider.mediaItems.elementAt(_currentIndex);
switch (value) {
case 'media':
File file = await DefaultCacheManager().getSingleFile(
item.mediaUrl,
);
Uint8List bytes = await file.readAsBytes();
final params = ShareParams(
files: [XFile.fromData(bytes, mimeType: item.mime)],
);
await SharePlus.instance.share(params);
break;
case 'direct_link':
await SharePlus.instance.share(ShareParams(text: item.mediaUrl));
break;
case 'post_link':
await SharePlus.instance.share(ShareParams(text: item.postUrl));
break;
}
},
itemBuilder: (context) => [
PopupMenuItem(
value: 'media',
child: ListTile(
leading: Icon(Icons.image),
title: Text('Als Datei'),
),
),
PopupMenuItem(
value: 'direct_link',
child: ListTile(
leading: Icon(Icons.link),
title: Text('Link zum Bild'),
),
),
PopupMenuItem(
value: 'post_link',
child: ListTile(
leading: Icon(Icons.article),
title: Text('Link zum Post'),
),
),
],
icon: Icon(Icons.share),
),
],
), ),
body: Stack( body: Stack(
children: [ children: [
@ -120,10 +174,6 @@ class _DetailViewState extends State<DetailView> {
), ),
persistentFooterButtons: provider.tag != null persistentFooterButtons: provider.tag != null
? [ ? [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('tag: '),
InputChip( InputChip(
label: Text(provider.tag!), label: Text(provider.tag!),
backgroundColor: const Color(0xFF090909), backgroundColor: const Color(0xFF090909),
@ -133,8 +183,6 @@ class _DetailViewState extends State<DetailView> {
Navigator.pop(context); Navigator.pop(context);
}, },
), ),
],
),
] ]
: null, : null,
); );
@ -155,11 +203,11 @@ class _DetailViewState extends State<DetailView> {
) )
else else
VideoWidget(details: item, isActive: isActive), VideoWidget(details: item, isActive: isActive),
const SizedBox(height: 20), /*const SizedBox(height: 20),
Text( Text(
item.mime, 'f0ck #${item.id.toString()}',
style: const TextStyle(color: Colors.white, fontSize: 18), style: const TextStyle(color: Colors.white, fontSize: 18),
), ),*/
const SizedBox(height: 10, width: double.infinity), const SizedBox(height: 10, width: double.infinity),
Wrap( Wrap(
alignment: WrapAlignment.center, alignment: WrapAlignment.center,
@ -170,7 +218,7 @@ class _DetailViewState extends State<DetailView> {
if (tag.tag == 'sfw' || tag.tag == 'nsfw') return; if (tag.tag == 'sfw' || tag.tag == 'nsfw') return;
setState(() { setState(() {
provider.setTag(tag.tag); provider.setTag(tag.tag);
Navigator.pop(context); Navigator.pop(context, true);
}); });
}, },
label: Text(tag.tag), label: Text(tag.tag),

View File

@ -1,3 +1,4 @@
import 'package:f0ckapp/services/Api.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart'; import 'package:cached_network_image/cached_network_image.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -27,26 +28,42 @@ class _MediaGridState extends State<MediaGrid> {
_scrollController.addListener(() { _scrollController.addListener(() {
if (_scrollController.position.pixels >= if (_scrollController.position.pixels >=
_scrollController.position.maxScrollExtent - 100) { _scrollController.position.maxScrollExtent - 200) {
provider.loadMedia(notify: false); provider.loadMedia(notify: false);
} }
}); });
} }
int _calculateCrossAxisCount(BuildContext context, int defaultCount) {
return defaultCount == 0
? (MediaQuery.of(context).size.width / 110).clamp(3, 5).toInt()
: defaultCount;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final provider = Provider.of<MediaProvider>(context); final provider = Provider.of<MediaProvider>(context);
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
final TextEditingController _usernameController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
return Scaffold( return Scaffold(
key: scaffoldKey, key: scaffoldKey,
appBar: AppBar( appBar: AppBar(
//centerTitle: true, title: Image.asset(
title: Text('fApp v${AppVersion.version}'), 'assets/images/f0ck_small.webp',
fit: BoxFit.fitHeight,
),
actions: [ actions: [
IconButton( IconButton(
icon: Icon(provider.random ? Icons.shuffle_on_outlined : Icons.shuffle), icon: Icon(
onPressed: () => provider.toggleRandom(), provider.random ? Icons.shuffle_on_outlined : Icons.shuffle,
),
onPressed: () {
provider.toggleRandom();
_scrollController.jumpTo(0);
},
), ),
IconButton( IconButton(
icon: const Icon(Icons.menu), icon: const Icon(Icons.menu),
@ -76,6 +93,7 @@ class _MediaGridState extends State<MediaGrid> {
onChanged: (String? newValue) { onChanged: (String? newValue) {
if (newValue != null) { if (newValue != null) {
provider.setType(newValue); provider.setType(newValue);
_scrollController.jumpTo(0);
} }
}, },
), ),
@ -94,6 +112,7 @@ class _MediaGridState extends State<MediaGrid> {
onChanged: (String? newValue) { onChanged: (String? newValue) {
if (newValue != null) { if (newValue != null) {
provider.setMode(provider.modes.indexOf(newValue)); provider.setMode(provider.modes.indexOf(newValue));
_scrollController.jumpTo(0);
} }
}, },
), ),
@ -105,33 +124,90 @@ class _MediaGridState extends State<MediaGrid> {
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
children: [ children: [
DrawerHeader( DrawerHeader(
padding: EdgeInsets.all(0), decoration: BoxDecoration(
child: Image.asset('assets/images/menu.webp', fit: BoxFit.cover), image: DecorationImage(
image: AssetImage('assets/images/menu.webp'),
fit: BoxFit.cover,
alignment: Alignment.topCenter,
),
),
child: null,
),
ExpansionTile(
title: Text('Login'),
children: [
Padding(
padding: EdgeInsets.all(16.0),
child: Column(
children: [
TextField(
readOnly: true,
controller: _usernameController,
decoration: InputDecoration(labelText: 'Benutzername'),
),
SizedBox(height: 10),
TextField(
readOnly: true,
controller: _passwordController,
obscureText: true,
decoration: InputDecoration(labelText: 'Passwort'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text("noch nicht implementiert lol"),
),
);
/*final success = await login(
_usernameController.text,
_passwordController.text,
);
if (success) {
Navigator.pop(context);
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Login fehlgeschlagen!")),
);
}*/
},
child: Text('Login'),
),
],
),
),
],
),
ListTile(
title: Text('v${AppVersion.version}'),
onTap: () {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('jooong lass das, hier ist nichts')),
);
},
), ),
], ],
), ),
), ),
persistentFooterButtons: provider.tag != null persistentFooterButtons: provider.tag != null
? [ ? [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('tag: '),
InputChip( InputChip(
label: Text(provider.tag!), label: Text(provider.tag!),
backgroundColor: const Color(0xFF090909), backgroundColor: const Color(0xFF090909),
labelStyle: const TextStyle(color: Colors.white), labelStyle: const TextStyle(color: Colors.white),
onDeleted: () { onDeleted: () {
provider.setTag(null); provider.setTag(null);
_scrollController.jumpTo(0);
}, },
), ),
],
),
] ]
: null, : null,
body: RefreshIndicator( body: RefreshIndicator(
onRefresh: () async { onRefresh: () async {
await provider.loadMedia(reload: true); await provider.resetMedia();
_scrollController.jumpTo(0);
}, },
child: Consumer<MediaProvider>( child: Consumer<MediaProvider>(
builder: (context, mediaProvider, child) { builder: (context, mediaProvider, child) {
@ -139,11 +215,10 @@ class _MediaGridState extends State<MediaGrid> {
key: PageStorageKey('mediaGrid'), key: PageStorageKey('mediaGrid'),
controller: _scrollController, controller: _scrollController,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: mediaProvider.crossAxisCount == 0 crossAxisCount: _calculateCrossAxisCount(
? (MediaQuery.of(context).size.width / 110) context,
.clamp(3, 5) provider.crossAxisCount,
.toInt() ),
: mediaProvider.crossAxisCount,
crossAxisSpacing: 5.0, crossAxisSpacing: 5.0,
mainAxisSpacing: 5.0, mainAxisSpacing: 5.0,
), ),
@ -156,12 +231,18 @@ class _MediaGridState extends State<MediaGrid> {
final item = provider.mediaItems[index]; final item = provider.mediaItems[index];
return InkWell( return InkWell(
onTap: () => Navigator.push( onTap: () async {
bool? ret = await Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (context) => DetailView(initialItemId: item.id), builder: (context) =>
), DetailView(initialItemId: item.id),
), ),
);
if (ret != null && ret) {
_scrollController.jumpTo(0);
}
},
child: Stack( child: Stack(
fit: StackFit.expand, fit: StackFit.expand,
children: <Widget>[ children: <Widget>[

View File

@ -1,8 +1,11 @@
import 'dart:convert'; import 'dart:convert';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:f0ckapp/models/MediaItem.dart'; import 'package:f0ckapp/models/MediaItem.dart';
final storage = FlutterSecureStorage();
Future<List<MediaItem>> fetchMedia({ Future<List<MediaItem>> fetchMedia({
int? older, int? older,
String? type, String? type,
@ -43,3 +46,21 @@ Future<MediaItem> fetchMediaDetail(int itemId) async {
); );
} }
} }
Future<bool> login(String username, String password) async {
final response = await http.post(
Uri.parse('https://api.f0ck.me/login'),
body: {'username': username, 'password': password},
);
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
final token = data['token'];
await storage.write(key: "token", value: token);
return true;
} else {
return false;
}
}

View File

@ -6,6 +6,14 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) { void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin");
flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar);
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
} }

View File

@ -3,6 +3,8 @@
# #
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
flutter_secure_storage_linux
url_launcher_linux
) )
list(APPEND FLUTTER_FFI_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST

View File

@ -5,14 +5,18 @@
import FlutterMacOS import FlutterMacOS
import Foundation import Foundation
import flutter_secure_storage_macos
import package_info_plus import package_info_plus
import path_provider_foundation import path_provider_foundation
import share_plus
import sqflite_darwin import sqflite_darwin
import video_player_avfoundation import video_player_avfoundation
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin"))
} }

View File

@ -73,6 +73,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.19.1" version: "1.19.1"
cross_file:
dependency: transitive
description:
name: cross_file
sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670"
url: "https://pub.dev"
source: hosted
version: "0.3.4+2"
crypto: crypto:
dependency: transitive dependency: transitive
description: description:
@ -150,6 +158,54 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.0.0" version: "6.0.0"
flutter_secure_storage:
dependency: "direct main"
description:
name: flutter_secure_storage
sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea"
url: "https://pub.dev"
source: hosted
version: "9.2.4"
flutter_secure_storage_linux:
dependency: transitive
description:
name: flutter_secure_storage_linux
sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688
url: "https://pub.dev"
source: hosted
version: "1.2.3"
flutter_secure_storage_macos:
dependency: transitive
description:
name: flutter_secure_storage_macos
sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247"
url: "https://pub.dev"
source: hosted
version: "3.1.3"
flutter_secure_storage_platform_interface:
dependency: transitive
description:
name: flutter_secure_storage_platform_interface
sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8
url: "https://pub.dev"
source: hosted
version: "1.1.2"
flutter_secure_storage_web:
dependency: transitive
description:
name: flutter_secure_storage_web
sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9
url: "https://pub.dev"
source: hosted
version: "1.2.1"
flutter_secure_storage_windows:
dependency: transitive
description:
name: flutter_secure_storage_windows
sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709
url: "https://pub.dev"
source: hosted
version: "3.1.2"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -200,6 +256,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.1.2" version: "4.1.2"
js:
dependency: transitive
description:
name: js
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
url: "https://pub.dev"
source: hosted
version: "0.6.7"
leak_tracker: leak_tracker:
dependency: transitive dependency: transitive
description: description:
@ -256,6 +320,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.16.0" version: "1.16.0"
mime:
dependency: transitive
description:
name: mime
sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
nested: nested:
dependency: transitive dependency: transitive
description: description:
@ -376,6 +448,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.28.0" version: "0.28.0"
share_plus:
dependency: "direct main"
description:
name: share_plus
sha256: b2961506569e28948d75ec346c28775bb111986bb69dc6a20754a457e3d97fa0
url: "https://pub.dev"
source: hosted
version: "11.0.0"
share_plus_platform_interface:
dependency: transitive
description:
name: share_plus_platform_interface
sha256: "1032d392bc5d2095a77447a805aa3f804d2ae6a4d5eef5e6ebb3bd94c1bc19ef"
url: "https://pub.dev"
source: hosted
version: "6.0.0"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -493,6 +581,38 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.4.0" version: "1.4.0"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
url: "https://pub.dev"
source: hosted
version: "3.2.1"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77"
url: "https://pub.dev"
source: hosted
version: "3.1.4"
uuid: uuid:
dependency: transitive dependency: transitive
description: description:

View File

@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts # In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix. # of the product and file versions while build-number is used as the build suffix.
version: 1.0.28+28 version: 1.1.1+32
environment: environment:
sdk: ^3.9.0-100.2.beta sdk: ^3.9.0-100.2.beta
@ -39,6 +39,8 @@ dependencies:
cached_video_player_plus: ^3.0.3 cached_video_player_plus: ^3.0.3
provider: ^6.1.5 provider: ^6.1.5
package_info_plus: ^8.3.0 package_info_plus: ^8.3.0
share_plus: ^11.0.0
flutter_secure_storage: ^9.2.4
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

View File

@ -6,6 +6,15 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
#include <share_plus/share_plus_windows_plugin_c_api.h>
#include <url_launcher_windows/url_launcher_windows.h>
void RegisterPlugins(flutter::PluginRegistry* registry) { void RegisterPlugins(flutter::PluginRegistry* registry) {
FlutterSecureStorageWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin"));
SharePlusWindowsPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi"));
UrlLauncherWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
} }

View File

@ -3,6 +3,9 @@
# #
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
flutter_secure_storage_windows
share_plus
url_launcher_windows
) )
list(APPEND FLUTTER_FFI_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST