Merge branch 'flutter3.16'

This commit is contained in:
Ming Ming 2024-05-25 17:45:56 +08:00
commit 88ee044e62
56 changed files with 1939 additions and 1545 deletions

View file

@ -3,7 +3,7 @@ test:
stage: test
except:
- triage
image: "ghcr.io/cirruslabs/flutter:3.7.12"
image: "ghcr.io/cirruslabs/flutter:3.16.9"
before_script:
- apt-get update -qq && apt-get install -y -qq libsqlite3-dev
- flutter pub global activate junitreport

View file

@ -34,7 +34,7 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
ext.abiCodes = ["armeabi-v7a": 1, "arm64-v8a": 2, "x86_64": 3]
android {
compileSdkVersion 33
compileSdkVersion 34
ndkVersion "23.2.8568313"
sourceSets {

View file

@ -26,6 +26,6 @@ subprojects {
project.evaluationDependsOn(':app')
}
task clean(type: Delete) {
tasks.register("clean", Delete) {
delete rootProject.buildDir
}

View file

@ -44,8 +44,8 @@ class _SignInState extends State<SignIn> {
Widget _buildContent(BuildContext context) {
if (_isConnecting) {
return Stack(
children: const [
return const Stack(
children: [
Positioned(
left: 0,
right: 0,

View file

@ -23,8 +23,8 @@ class ContentUriImage extends ImageProvider<ContentUriImage>
}
@override
ImageStreamCompleter loadBuffer(
ContentUriImage key, DecoderBufferCallback decode) {
ImageStreamCompleter loadImage(
ContentUriImage key, ImageDecoderCallback decode) {
return MultiFrameImageStreamCompleter(
codec: _loadAsync(key, decode),
scale: key.scale,
@ -36,7 +36,7 @@ class ContentUriImage extends ImageProvider<ContentUriImage>
}
Future<ui.Codec> _loadAsync(
ContentUriImage key, DecoderBufferCallback decode) async {
ContentUriImage key, ImageDecoderCallback decode) async {
assert(key == this);
final bytes = await ContentUri.readUri(uri);
if (bytes.lengthInBytes == 0) {

View file

@ -186,7 +186,7 @@ class ShareHandler {
file,
password: password,
);
await Clipboard.setData(ClipboardData(text: share.url));
await Clipboard.setData(ClipboardData(text: share.url!));
SnackBarManager().showSnackBar(SnackBar(
content: Text(L10n.global().linkCopiedNotification),
duration: k.snackBarDurationNormal,

View file

@ -143,198 +143,202 @@ class _WrappedCollectionBrowserState extends State<_WrappedCollectionBrowser>
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
if (_bloc.state.isEditMode) {
_bloc.add(const _CancelEdit());
return false;
} else if (_bloc.state.selectedItems.isNotEmpty) {
_bloc.add(const _SetSelectedItems(items: {}));
return false;
} else {
return true;
}
},
child: Scaffold(
body: MultiBlocListener(
listeners: [
_BlocListener(
listenWhen: (previous, current) =>
previous.items != current.items,
listener: (context, state) {
_bloc.add(_TransformItems(
items: state.items,
));
},
),
_BlocListener(
listenWhen: (previous, current) =>
previous.editItems != current.editItems,
listener: (context, state) {
if (state.editItems != null) {
_bloc.add(_TransformEditItems(
items: state.editItems!,
return _BlocBuilder(
buildWhen: (previous, current) =>
previous.isEditMode != current.isEditMode ||
previous.selectedItems.isEmpty != current.selectedItems.isEmpty,
builder: (context, state) => PopScope(
canPop: !state.isEditMode && state.selectedItems.isEmpty,
onPopInvoked: (didPop) {
if (state.isEditMode) {
_bloc.add(const _CancelEdit());
} else if (state.selectedItems.isNotEmpty) {
_bloc.add(const _SetSelectedItems(items: {}));
}
},
child: Scaffold(
body: MultiBlocListener(
listeners: [
_BlocListener(
listenWhen: (previous, current) =>
previous.items != current.items,
listener: (context, state) {
_bloc.add(_TransformItems(
items: state.items,
));
}
},
),
_BlocListener(
listenWhen: (previous, current) =>
previous.importResult != current.importResult,
listener: (context, state) {
if (state.importResult != null) {
Navigator.of(context).pushReplacementNamed(
CollectionBrowser.routeName,
arguments: CollectionBrowserArguments(state.importResult!),
);
}
},
),
_BlocListener(
listenWhen: (previous, current) =>
previous.isEditMode != current.isEditMode,
listener: (context, state) {
final c = KiwiContainer().resolve<DiContainer>();
final bloc = context.read<_Bloc>();
final canSort =
CollectionAdapter.of(c, bloc.account, state.collection)
.isPermitted(CollectionCapability.manualSort);
if (canSort &&
!SessionStorage().hasShowDragRearrangeNotification) {
SnackBarManager().showSnackBar(SnackBar(
content:
Text(L10n.global().albumEditDragRearrangeNotification),
duration: k.snackBarDurationNormal,
));
SessionStorage().hasShowDragRearrangeNotification = true;
}
},
),
_BlocListenerT<ExceptionEvent?>(
selector: (state) => state.error,
listener: (context, error) {
if (error != null && isPageVisible()) {
final String content;
if (error.error is _ArchiveFailedError) {
content = L10n.global().archiveSelectedFailureNotification(
(error.error as _ArchiveFailedError).count);
} else if (error.error is _RemoveFailedError) {
content = L10n.global().deleteSelectedFailureNotification(
(error.error as _RemoveFailedError).count);
} else {
content = exception_util.toUserString(error.error);
}
SnackBarManager().showSnackBar(SnackBar(
content: Text(content),
duration: k.snackBarDurationNormal,
));
}
},
),
_BlocListener(
listenWhen: (previous, current) =>
previous.message != current.message,
listener: (context, state) {
if (state.message != null && isPageVisible()) {
SnackBarManager().showSnackBar(SnackBar(
content: Text(state.message!),
duration: k.snackBarDurationNormal,
));
}
},
),
],
child: Stack(
fit: StackFit.expand,
children: [
FingerListener(
onPointerMove: (event) => _onPointerMove(context, event),
onFingerChanged: (finger) {
setState(() {
_finger = finger;
});
},
child: GestureDetector(
onScaleStart: (_) {
_bloc.add(const _StartScaling());
},
onScaleUpdate: (details) {
_bloc.add(_SetScale(details.scale));
},
onScaleEnd: (_) {
_bloc.add(const _EndScaling());
},
child: CustomScrollView(
controller: _scrollController,
physics: _finger >= 2
? const NeverScrollableScrollPhysics()
: null,
slivers: [
_BlocBuilder(
buildWhen: (previous, current) =>
previous.selectedItems.isEmpty !=
current.selectedItems.isEmpty ||
previous.isEditMode != current.isEditMode,
builder: (context, state) {
if (state.isEditMode) {
return const _EditAppBar();
} else if (state.selectedItems.isNotEmpty) {
return const _SelectionAppBar();
} else {
return const _AppBar();
}
},
),
SliverToBoxAdapter(
child: _BlocBuilder(
buildWhen: (previous, current) =>
previous.isLoading != current.isLoading,
builder: (context, state) => state.isLoading
? const LinearProgressIndicator()
: const SizedBox(height: 4),
),
),
_BlocBuilder(
buildWhen: (previous, current) =>
previous.isEditMode != current.isEditMode ||
previous.scale != current.scale,
builder: (context, state) {
if (!state.isEditMode) {
return SliverTransitionedScale(
scale: state.scale,
baseSliver: const _ContentList(),
overlaySliver: const _ScalingList(),
);
} else {
if (context.bloc.isCollectionCapabilityPermitted(
CollectionCapability.manualSort)) {
return const _EditContentList();
} else {
return const _UnmodifiableEditContentList();
}
}
},
),
],
),
),
),
_BlocBuilder(
buildWhen: (previous, current) =>
previous.isEditBusy != current.isEditBusy,
builder: (context, state) {
if (state.isEditBusy) {
return Container(
color: Colors.black.withOpacity(.5),
alignment: Alignment.center,
child: const CircularProgressIndicator(),
_BlocListener(
listenWhen: (previous, current) =>
previous.editItems != current.editItems,
listener: (context, state) {
if (state.editItems != null) {
_bloc.add(_TransformEditItems(
items: state.editItems!,
));
}
},
),
_BlocListener(
listenWhen: (previous, current) =>
previous.importResult != current.importResult,
listener: (context, state) {
if (state.importResult != null) {
Navigator.of(context).pushReplacementNamed(
CollectionBrowser.routeName,
arguments:
CollectionBrowserArguments(state.importResult!),
);
} else {
return const SizedBox.shrink();
}
},
),
_BlocListener(
listenWhen: (previous, current) =>
previous.isEditMode != current.isEditMode,
listener: (context, state) {
final c = KiwiContainer().resolve<DiContainer>();
final bloc = context.read<_Bloc>();
final canSort =
CollectionAdapter.of(c, bloc.account, state.collection)
.isPermitted(CollectionCapability.manualSort);
if (canSort &&
!SessionStorage().hasShowDragRearrangeNotification) {
SnackBarManager().showSnackBar(SnackBar(
content: Text(
L10n.global().albumEditDragRearrangeNotification),
duration: k.snackBarDurationNormal,
));
SessionStorage().hasShowDragRearrangeNotification = true;
}
},
),
_BlocListenerT<ExceptionEvent?>(
selector: (state) => state.error,
listener: (context, error) {
if (error != null && isPageVisible()) {
final String content;
if (error.error is _ArchiveFailedError) {
content = L10n.global()
.archiveSelectedFailureNotification(
(error.error as _ArchiveFailedError).count);
} else if (error.error is _RemoveFailedError) {
content = L10n.global().deleteSelectedFailureNotification(
(error.error as _RemoveFailedError).count);
} else {
content = exception_util.toUserString(error.error);
}
SnackBarManager().showSnackBar(SnackBar(
content: Text(content),
duration: k.snackBarDurationNormal,
));
}
},
),
_BlocListener(
listenWhen: (previous, current) =>
previous.message != current.message,
listener: (context, state) {
if (state.message != null && isPageVisible()) {
SnackBarManager().showSnackBar(SnackBar(
content: Text(state.message!),
duration: k.snackBarDurationNormal,
));
}
},
),
],
child: Stack(
fit: StackFit.expand,
children: [
FingerListener(
onPointerMove: (event) => _onPointerMove(context, event),
onFingerChanged: (finger) {
setState(() {
_finger = finger;
});
},
child: GestureDetector(
onScaleStart: (_) {
_bloc.add(const _StartScaling());
},
onScaleUpdate: (details) {
_bloc.add(_SetScale(details.scale));
},
onScaleEnd: (_) {
_bloc.add(const _EndScaling());
},
child: CustomScrollView(
controller: _scrollController,
physics: _finger >= 2
? const NeverScrollableScrollPhysics()
: null,
slivers: [
_BlocBuilder(
buildWhen: (previous, current) =>
previous.selectedItems.isEmpty !=
current.selectedItems.isEmpty ||
previous.isEditMode != current.isEditMode,
builder: (context, state) {
if (state.isEditMode) {
return const _EditAppBar();
} else if (state.selectedItems.isNotEmpty) {
return const _SelectionAppBar();
} else {
return const _AppBar();
}
},
),
SliverToBoxAdapter(
child: _BlocBuilder(
buildWhen: (previous, current) =>
previous.isLoading != current.isLoading,
builder: (context, state) => state.isLoading
? const LinearProgressIndicator()
: const SizedBox(height: 4),
),
),
_BlocBuilder(
buildWhen: (previous, current) =>
previous.isEditMode != current.isEditMode ||
previous.scale != current.scale,
builder: (context, state) {
if (!state.isEditMode) {
return SliverTransitionedScale(
scale: state.scale,
baseSliver: const _ContentList(),
overlaySliver: const _ScalingList(),
);
} else {
if (context.bloc.isCollectionCapabilityPermitted(
CollectionCapability.manualSort)) {
return const _EditContentList();
} else {
return const _UnmodifiableEditContentList();
}
}
},
),
],
),
),
),
_BlocBuilder(
buildWhen: (previous, current) =>
previous.isEditBusy != current.isEditBusy,
builder: (context, state) {
if (state.isEditBusy) {
return Container(
color: Colors.black.withOpacity(.5),
alignment: Alignment.center,
child: const CircularProgressIndicator(),
);
} else {
return const SizedBox.shrink();
}
},
),
],
),
),
),
),

View file

@ -18,8 +18,8 @@ class DialogScaffold extends StatelessWidget {
Navigator.of(context).pop();
}
},
child: WillPopScope(
onWillPop: () => Future.value(canPop),
child: PopScope(
canPop: canPop,
child: Scaffold(
backgroundColor: Colors.transparent,
body: GestureDetector(

View file

@ -107,10 +107,10 @@ class _WrappedExportCollectionDialogState
key: _formKey,
child: Container(
constraints: const BoxConstraints.tightFor(width: 280),
child: Column(
child: const Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: const [
children: [
_NameTextField(),
_ProviderDropdown(),
SizedBox(height: 8),

View file

@ -230,7 +230,7 @@ class _Bloc extends Bloc<_Event, _State> with BlocLogger {
file,
password: password,
);
await Clipboard.setData(ClipboardData(text: share.url));
await Clipboard.setData(ClipboardData(text: share.url!));
if (getRawPlatform() == NpPlatform.android) {
final textShare = AndroidTextShare(share.url!);

View file

@ -8,7 +8,6 @@ import 'package:nc_photos/controller/account_pref_controller.dart';
import 'package:nc_photos/stream_util.dart';
import 'package:nc_photos/theme.dart';
import 'package:nc_photos/widget/account_picker_dialog.dart';
import 'package:nc_photos/widget/translucent_sliver_app_bar.dart';
import 'package:np_ui/np_ui.dart';
/// AppBar for home screens
@ -36,6 +35,7 @@ class HomeSliverAppBar extends StatelessWidget {
),
scrolledUnderBackgroundColor:
Theme.of(context).homeNavigationBarBackgroundColor,
blurFilter: Theme.of(context).appBarBlurFilter,
floating: true,
automaticallyImplyLeading: false,
actions: [

View file

@ -191,8 +191,7 @@ class _WrappedHomeCollectionsState extends State<_WrappedHomeCollections>
childBorderRadius: BorderRadius.zero,
indicatorAlignment: const Alignment(-.92, -.92),
items: state.transformedItems,
itemBuilder: (_, __, metadata) {
final item = metadata as _Item;
itemBuilder: (_, __, item) {
return _BlocSelector<int?>(
selector: (state) =>
state.itemCounts[item.collection.id],
@ -209,8 +208,7 @@ class _WrappedHomeCollectionsState extends State<_WrappedHomeCollections>
onSelectionChange: (_, selected) {
_bloc.add(_SetSelectedItems(items: selected.cast()));
},
onItemTap: (context, _, metadata) {
final item = metadata as _Item;
onItemTap: (context, _, item) {
Navigator.of(context).pushNamed(
CollectionBrowser.routeName,
arguments:

View file

@ -128,10 +128,12 @@ class _ImageEditorState extends State<ImageEditor> {
}
Widget _buildContent(BuildContext context) {
return WillPopScope(
onWillPop: () async {
unawaited(_onBackButton(context));
return false;
return PopScope(
canPop: false,
onPopInvoked: (didPop) {
if (!didPop) {
_onBackButton(context);
}
},
child: ColoredBox(
color: Colors.black,

View file

@ -117,10 +117,10 @@ class _WrappedNewCollectionDialogState
key: _formKey,
child: Container(
constraints: const BoxConstraints.tightFor(width: 280),
child: Column(
child: const Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: const [
children: [
_NameTextField(),
_ProviderDropdown(),
SizedBox(height: 8),

View file

@ -8,8 +8,8 @@ class ProcessingDialog extends StatelessWidget {
@override
build(BuildContext context) {
return WillPopScope(
onWillPop: () => Future.value(false),
return PopScope(
canPop: false,
child: AlertDialog(
content: Row(
mainAxisSize: MainAxisSize.min,

View file

@ -28,6 +28,7 @@ abstract class SelectableItem {
StaggeredTile get staggeredTile => const StaggeredTile.count(1, 1);
}
@Deprecated("Use SelectableItemList widget")
mixin SelectableItemStreamListMixin<T extends StatefulWidget> on State<T> {
@override
initState() {

View file

@ -146,80 +146,81 @@ class _WrappedAccountSettingsState extends State<_WrappedAccountSettings>
},
),
],
child: WillPopScope(
onWillPop: () async => !_bloc.state.shouldReload,
child: CustomScrollView(
slivers: [
SliverAppBar(
pinned: true,
title: Text(L10n.global().settingsAccountTitle),
leading: _BlocSelector<bool>(
selector: (state) => state.shouldReload,
builder: (_, state) =>
state ? const _DoneButton() : const BackButton(),
child: _BlocSelector<bool>(
selector: (state) => state.shouldReload,
builder: (_, shouldReload) => PopScope(
canPop: !shouldReload,
child: CustomScrollView(
slivers: [
SliverAppBar(
pinned: true,
title: Text(L10n.global().settingsAccountTitle),
leading:
shouldReload ? const _DoneButton() : const BackButton(),
),
),
SliverList(
delegate: SliverChildListDelegate(
[
_BlocSelector<String?>(
selector: (state) => state.label,
builder: (context, state) => ListTile(
title: Text(L10n.global().settingsAccountLabelTitle),
subtitle: Text(state ??
L10n.global().settingsAccountLabelDescription),
onTap: () => _onLabelPressed(context),
SliverList(
delegate: SliverChildListDelegate(
[
_BlocSelector<String?>(
selector: (state) => state.label,
builder: (context, state) => ListTile(
title: Text(L10n.global().settingsAccountLabelTitle),
subtitle: Text(state ??
L10n.global().settingsAccountLabelDescription),
onTap: () => _onLabelPressed(context),
),
),
),
_BlocSelector<Account>(
selector: (state) => state.account,
builder: (context, state) => ListTile(
title: Text(L10n.global().settingsIncludedFoldersTitle),
subtitle:
Text(state.roots.map((e) => "/$e").join("; ")),
onTap: () => _onIncludedFoldersPressed(context),
_BlocSelector<Account>(
selector: (state) => state.account,
builder: (context, state) => ListTile(
title:
Text(L10n.global().settingsIncludedFoldersTitle),
subtitle:
Text(state.roots.map((e) => "/$e").join("; ")),
onTap: () => _onIncludedFoldersPressed(context),
),
),
),
_BlocSelector<String>(
selector: (state) => state.shareFolder,
builder: (context, state) => ListTile(
title: Text(L10n.global().settingsShareFolderTitle),
subtitle: Text("/$state"),
onTap: () => _onShareFolderPressed(context),
_BlocSelector<String>(
selector: (state) => state.shareFolder,
builder: (context, state) => ListTile(
title: Text(L10n.global().settingsShareFolderTitle),
subtitle: Text("/$state"),
onTap: () => _onShareFolderPressed(context),
),
),
),
SettingsListCaption(
label: L10n.global().settingsServerAppSectionTitle,
),
_BlocSelector<PersonProvider>(
selector: (state) => state.personProvider,
builder: (context, state) {
if (_bloc.highlight ==
AccountSettingsOption.personProvider) {
return AnimatedBuilder(
animation: _highlightAnimation,
builder: (context, child) => ListTile(
SettingsListCaption(
label: L10n.global().settingsServerAppSectionTitle,
),
_BlocSelector<PersonProvider>(
selector: (state) => state.personProvider,
builder: (context, state) {
if (_bloc.highlight ==
AccountSettingsOption.personProvider) {
return AnimatedBuilder(
animation: _highlightAnimation,
builder: (context, child) => ListTile(
title: Text(
L10n.global().settingsPersonProviderTitle),
subtitle: Text(state.toUserString()),
onTap: () => _onPersonProviderPressed(context),
tileColor: _highlightAnimation.value,
),
);
} else {
return ListTile(
title: Text(
L10n.global().settingsPersonProviderTitle),
subtitle: Text(state.toUserString()),
onTap: () => _onPersonProviderPressed(context),
tileColor: _highlightAnimation.value,
),
);
} else {
return ListTile(
title:
Text(L10n.global().settingsPersonProviderTitle),
subtitle: Text(state.toUserString()),
onTap: () => _onPersonProviderPressed(context),
);
}
},
),
],
);
}
},
),
],
),
),
),
],
],
),
),
),
),

View file

@ -62,8 +62,8 @@ class _SignInState extends State<SignIn> {
Widget _buildContent(BuildContext context) {
if (_isConnecting) {
return Stack(
children: const [
return const Stack(
children: [
Positioned(
left: 0,
right: 0,

View file

@ -70,8 +70,8 @@ class _SplashState extends State<Splash> {
@override
build(BuildContext context) {
return Scaffold(
body: WillPopScope(
onWillPop: () => Future.value(false),
body: PopScope(
canPop: false,
child: Builder(builder: (context) => _buildContent(context)),
),
);

View file

@ -1,708 +0,0 @@
// ignore_for_file: deprecated_member_use, unnecessary_null_comparison, curly_braces_in_flow_control_structures, deprecated_member_use_from_same_package
import 'dart:math' as math;
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:nc_photos/theme.dart';
/// A translucent sliver app bar used in home pages
///
/// This calss is adopted from Flutter's SliverAppBar
class TranslucentSliverAppBar extends StatefulWidget {
/// Creates a material design app bar that can be placed in a [CustomScrollView].
///
/// The arguments [forceElevated], [primary], [floating], [pinned], [snap]
/// and [automaticallyImplyLeading] must not be null.
const TranslucentSliverAppBar({
Key? key,
this.leading,
this.automaticallyImplyLeading = true,
this.title,
this.actions,
this.flexibleSpace,
this.bottom,
this.elevation,
this.shadowColor,
this.surfaceTintColor,
this.forceElevated = false,
this.backgroundColor,
this.scrolledUnderBackgroundColor,
this.foregroundColor,
@Deprecated(
'This property is no longer used, please use systemOverlayStyle instead. '
'This feature was deprecated after v2.4.0-0.0.pre.',
)
this.brightness,
this.iconTheme,
this.actionsIconTheme,
@Deprecated(
'This property is no longer used, please use toolbarTextStyle and titleTextStyle instead. '
'This feature was deprecated after v2.4.0-0.0.pre.',
)
this.textTheme,
this.primary = true,
this.centerTitle,
this.excludeHeaderSemantics = false,
this.titleSpacing,
this.collapsedHeight,
this.expandedHeight,
this.floating = false,
this.pinned = false,
this.snap = false,
this.stretch = false,
this.stretchTriggerOffset = 100.0,
this.onStretchTrigger,
this.shape,
this.toolbarHeight = kToolbarHeight,
this.leadingWidth,
@Deprecated(
'This property is obsolete and is false by default. '
'This feature was deprecated after v2.4.0-0.0.pre.',
)
this.backwardsCompatibility,
this.toolbarTextStyle,
this.titleTextStyle,
this.systemOverlayStyle,
}) : assert(automaticallyImplyLeading != null),
assert(forceElevated != null),
assert(primary != null),
assert(floating != null),
assert(pinned != null),
assert(snap != null),
assert(stretch != null),
assert(toolbarHeight != null),
assert(floating || !snap,
'The "snap" argument only makes sense for floating app bars.'),
assert(stretchTriggerOffset > 0.0),
assert(collapsedHeight == null || collapsedHeight >= toolbarHeight,
'The "collapsedHeight" argument has to be larger than or equal to [toolbarHeight].'),
super(key: key);
/// {@macro flutter.material.appbar.leading}
///
/// This property is used to configure an [AppBar].
final Widget? leading;
/// {@macro flutter.material.appbar.automaticallyImplyLeading}
///
/// This property is used to configure an [AppBar].
final bool automaticallyImplyLeading;
/// {@macro flutter.material.appbar.title}
///
/// This property is used to configure an [AppBar].
final Widget? title;
/// {@macro flutter.material.appbar.actions}
///
/// This property is used to configure an [AppBar].
final List<Widget>? actions;
/// {@macro flutter.material.appbar.flexibleSpace}
///
/// This property is used to configure an [AppBar].
final Widget? flexibleSpace;
/// {@macro flutter.material.appbar.bottom}
///
/// This property is used to configure an [AppBar].
final PreferredSizeWidget? bottom;
/// {@macro flutter.material.appbar.elevation}
///
/// This property is used to configure an [AppBar].
final double? elevation;
/// {@macro flutter.material.appbar.shadowColor}
///
/// This property is used to configure an [AppBar].
final Color? shadowColor;
/// {@macro flutter.material.appbar.surfaceTintColor}
///
/// This property is used to configure an [AppBar].
final Color? surfaceTintColor;
/// Whether to show the shadow appropriate for the [elevation] even if the
/// content is not scrolled under the [AppBar].
///
/// Defaults to false, meaning that the [elevation] is only applied when the
/// [AppBar] is being displayed over content that is scrolled under it.
///
/// When set to true, the [elevation] is applied regardless.
///
/// Ignored when [elevation] is zero.
final bool forceElevated;
/// {@macro flutter.material.appbar.backgroundColor}
///
/// This property is used to configure an [AppBar].
final Color? backgroundColor;
final Color? scrolledUnderBackgroundColor;
/// {@macro flutter.material.appbar.foregroundColor}
///
/// This property is used to configure an [AppBar].
final Color? foregroundColor;
/// {@macro flutter.material.appbar.brightness}
///
/// This property is used to configure an [AppBar].
@Deprecated(
'This property is no longer used, please use systemOverlayStyle instead. '
'This feature was deprecated after v2.4.0-0.0.pre.',
)
final Brightness? brightness;
/// {@macro flutter.material.appbar.iconTheme}
///
/// This property is used to configure an [AppBar].
final IconThemeData? iconTheme;
/// {@macro flutter.material.appbar.actionsIconTheme}
///
/// This property is used to configure an [AppBar].
final IconThemeData? actionsIconTheme;
/// {@macro flutter.material.appbar.textTheme}
///
/// This property is used to configure an [AppBar].
@Deprecated(
'This property is no longer used, please use toolbarTextStyle and titleTextStyle instead. '
'This feature was deprecated after v2.4.0-0.0.pre.',
)
final TextTheme? textTheme;
/// {@macro flutter.material.appbar.primary}
///
/// This property is used to configure an [AppBar].
final bool primary;
/// {@macro flutter.material.appbar.centerTitle}
///
/// This property is used to configure an [AppBar].
final bool? centerTitle;
/// {@macro flutter.material.appbar.excludeHeaderSemantics}
///
/// This property is used to configure an [AppBar].
final bool excludeHeaderSemantics;
/// {@macro flutter.material.appbar.titleSpacing}
///
/// This property is used to configure an [AppBar].
final double? titleSpacing;
/// Defines the height of the app bar when it is collapsed.
///
/// By default, the collapsed height is [toolbarHeight]. If [bottom] widget is
/// specified, then its height from [PreferredSizeWidget.preferredSize] is
/// added to the height. If [primary] is true, then the [MediaQuery] top
/// padding, [EdgeInsets.top] of [MediaQueryData.padding], is added as well.
///
/// If [pinned] and [floating] are true, with [bottom] set, the default
/// collapsed height is only the height of [PreferredSizeWidget.preferredSize]
/// with the [MediaQuery] top padding.
final double? collapsedHeight;
/// The size of the app bar when it is fully expanded.
///
/// By default, the total height of the toolbar and the bottom widget (if
/// any). If a [flexibleSpace] widget is specified this height should be big
/// enough to accommodate whatever that widget contains.
///
/// This does not include the status bar height (which will be automatically
/// included if [primary] is true).
final double? expandedHeight;
/// Whether the app bar should become visible as soon as the user scrolls
/// towards the app bar.
///
/// Otherwise, the user will need to scroll near the top of the scroll view to
/// reveal the app bar.
///
/// If [snap] is true then a scroll that exposes the app bar will trigger an
/// animation that slides the entire app bar into view. Similarly if a scroll
/// dismisses the app bar, the animation will slide it completely out of view.
///
/// ## Animated Examples
///
/// The following animations show how the app bar changes its scrolling
/// behavior based on the value of this property.
///
/// * App bar with [floating] set to false:
/// {@animation 476 400 https://flutter.github.io/assets-for-api-docs/assets/material/app_bar.mp4}
/// * App bar with [floating] set to true:
/// {@animation 476 400 https://flutter.github.io/assets-for-api-docs/assets/material/app_bar_floating.mp4}
///
/// See also:
///
/// * [SliverAppBar] for more animated examples of how this property changes the
/// behavior of the app bar in combination with [pinned] and [snap].
final bool floating;
/// Whether the app bar should remain visible at the start of the scroll view.
///
/// The app bar can still expand and contract as the user scrolls, but it will
/// remain visible rather than being scrolled out of view.
///
/// ## Animated Examples
///
/// The following animations show how the app bar changes its scrolling
/// behavior based on the value of this property.
///
/// * App bar with [pinned] set to false:
/// {@animation 476 400 https://flutter.github.io/assets-for-api-docs/assets/material/app_bar.mp4}
/// * App bar with [pinned] set to true:
/// {@animation 476 400 https://flutter.github.io/assets-for-api-docs/assets/material/app_bar_pinned.mp4}
///
/// See also:
///
/// * [SliverAppBar] for more animated examples of how this property changes the
/// behavior of the app bar in combination with [floating].
final bool pinned;
/// {@macro flutter.material.appbar.shape}
///
/// This property is used to configure an [AppBar].
final ShapeBorder? shape;
/// If [snap] and [floating] are true then the floating app bar will "snap"
/// into view.
///
/// If [snap] is true then a scroll that exposes the floating app bar will
/// trigger an animation that slides the entire app bar into view. Similarly
/// if a scroll dismisses the app bar, the animation will slide the app bar
/// completely out of view. Additionally, setting [snap] to true will fully
/// expand the floating app bar when the framework tries to reveal the
/// contents of the app bar by calling [RenderObject.showOnScreen]. For
/// example, when a [TextField] in the floating app bar gains focus, if [snap]
/// is true, the framework will always fully expand the floating app bar, in
/// order to reveal the focused [TextField].
///
/// Snapping only applies when the app bar is floating, not when the app bar
/// appears at the top of its scroll view.
///
/// ## Animated Examples
///
/// The following animations show how the app bar changes its scrolling
/// behavior based on the value of this property.
///
/// * App bar with [snap] set to false:
/// {@animation 476 400 https://flutter.github.io/assets-for-api-docs/assets/material/app_bar_floating.mp4}
/// * App bar with [snap] set to true:
/// {@animation 476 400 https://flutter.github.io/assets-for-api-docs/assets/material/app_bar_floating_snap.mp4}
///
/// See also:
///
/// * [SliverAppBar] for more animated examples of how this property changes the
/// behavior of the app bar in combination with [pinned] and [floating].
final bool snap;
/// Whether the app bar should stretch to fill the over-scroll area.
///
/// The app bar can still expand and contract as the user scrolls, but it will
/// also stretch when the user over-scrolls.
final bool stretch;
/// The offset of overscroll required to activate [onStretchTrigger].
///
/// This defaults to 100.0.
final double stretchTriggerOffset;
/// The callback function to be executed when a user over-scrolls to the
/// offset specified by [stretchTriggerOffset].
final AsyncCallback? onStretchTrigger;
/// {@macro flutter.material.appbar.toolbarHeight}
///
/// This property is used to configure an [AppBar].
final double toolbarHeight;
/// {@macro flutter.material.appbar.leadingWidth}
///
/// This property is used to configure an [AppBar].
final double? leadingWidth;
/// {@macro flutter.material.appbar.backwardsCompatibility}
///
/// This property is used to configure an [AppBar].
@Deprecated(
'This property is obsolete and is false by default. '
'This feature was deprecated after v2.4.0-0.0.pre.',
)
final bool? backwardsCompatibility;
/// {@macro flutter.material.appbar.toolbarTextStyle}
///
/// This property is used to configure an [AppBar].
final TextStyle? toolbarTextStyle;
/// {@macro flutter.material.appbar.titleTextStyle}
///
/// This property is used to configure an [AppBar].
final TextStyle? titleTextStyle;
/// {@macro flutter.material.appbar.systemOverlayStyle}
///
/// This property is used to configure an [AppBar].
final SystemUiOverlayStyle? systemOverlayStyle;
@override
State<TranslucentSliverAppBar> createState() => _SliverAppBarState();
}
class _SliverAppBarState extends State<TranslucentSliverAppBar>
with TickerProviderStateMixin {
FloatingHeaderSnapConfiguration? _snapConfiguration;
OverScrollHeaderStretchConfiguration? _stretchConfiguration;
PersistentHeaderShowOnScreenConfiguration? _showOnScreenConfiguration;
void _updateSnapConfiguration() {
if (widget.snap && widget.floating) {
_snapConfiguration = FloatingHeaderSnapConfiguration(
curve: Curves.easeOut,
duration: const Duration(milliseconds: 200),
);
} else {
_snapConfiguration = null;
}
_showOnScreenConfiguration = widget.floating & widget.snap
? const PersistentHeaderShowOnScreenConfiguration(
minShowOnScreenExtent: double.infinity)
: null;
}
void _updateStretchConfiguration() {
if (widget.stretch) {
_stretchConfiguration = OverScrollHeaderStretchConfiguration(
stretchTriggerOffset: widget.stretchTriggerOffset,
onStretchTrigger: widget.onStretchTrigger,
);
} else {
_stretchConfiguration = null;
}
}
@override
void initState() {
super.initState();
_updateSnapConfiguration();
_updateStretchConfiguration();
}
@override
void didUpdateWidget(TranslucentSliverAppBar oldWidget) {
super.didUpdateWidget(oldWidget);
if (widget.snap != oldWidget.snap || widget.floating != oldWidget.floating)
_updateSnapConfiguration();
if (widget.stretch != oldWidget.stretch) _updateStretchConfiguration();
}
@override
Widget build(BuildContext context) {
assert(!widget.primary || debugCheckHasMediaQuery(context));
final double bottomHeight = widget.bottom?.preferredSize.height ?? 0.0;
final double topPadding =
widget.primary ? MediaQuery.of(context).padding.top : 0.0;
final double collapsedHeight =
(widget.pinned && widget.floating && widget.bottom != null)
? (widget.collapsedHeight ?? 0.0) + bottomHeight + topPadding
: (widget.collapsedHeight ?? widget.toolbarHeight) +
bottomHeight +
topPadding;
return MediaQuery.removePadding(
context: context,
removeBottom: true,
child: SliverPersistentHeader(
floating: widget.floating,
pinned: widget.pinned,
delegate: _SliverAppBarDelegate(
vsync: this,
leading: widget.leading,
automaticallyImplyLeading: widget.automaticallyImplyLeading,
title: widget.title,
actions: widget.actions,
flexibleSpace: widget.flexibleSpace,
bottom: widget.bottom,
elevation: widget.elevation,
shadowColor: widget.shadowColor,
surfaceTintColor: widget.surfaceTintColor,
forceElevated: widget.forceElevated,
backgroundColor: widget.backgroundColor,
scrolledUnderBackgroundColor: widget.scrolledUnderBackgroundColor,
foregroundColor: widget.foregroundColor,
brightness: widget.brightness,
iconTheme: widget.iconTheme,
actionsIconTheme: widget.actionsIconTheme,
textTheme: widget.textTheme,
primary: widget.primary,
centerTitle: widget.centerTitle,
excludeHeaderSemantics: widget.excludeHeaderSemantics,
titleSpacing: widget.titleSpacing,
expandedHeight: widget.expandedHeight,
collapsedHeight: collapsedHeight,
topPadding: topPadding,
floating: widget.floating,
pinned: widget.pinned,
shape: widget.shape,
snapConfiguration: _snapConfiguration,
stretchConfiguration: _stretchConfiguration,
showOnScreenConfiguration: _showOnScreenConfiguration,
toolbarHeight: widget.toolbarHeight,
leadingWidth: widget.leadingWidth,
backwardsCompatibility: widget.backwardsCompatibility,
toolbarTextStyle: widget.toolbarTextStyle,
titleTextStyle: widget.titleTextStyle,
systemOverlayStyle: widget.systemOverlayStyle,
),
),
);
}
}
class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
_SliverAppBarDelegate({
required this.leading,
required this.automaticallyImplyLeading,
required this.title,
required this.actions,
required this.flexibleSpace,
required this.bottom,
required this.elevation,
required this.shadowColor,
required this.surfaceTintColor,
required this.forceElevated,
required this.backgroundColor,
required this.scrolledUnderBackgroundColor,
required this.foregroundColor,
required this.brightness,
required this.iconTheme,
required this.actionsIconTheme,
required this.textTheme,
required this.primary,
required this.centerTitle,
required this.excludeHeaderSemantics,
required this.titleSpacing,
required this.expandedHeight,
required this.collapsedHeight,
required this.topPadding,
required this.floating,
required this.pinned,
required this.vsync,
required this.snapConfiguration,
required this.stretchConfiguration,
required this.showOnScreenConfiguration,
required this.shape,
required this.toolbarHeight,
required this.leadingWidth,
required this.backwardsCompatibility,
required this.toolbarTextStyle,
required this.titleTextStyle,
required this.systemOverlayStyle,
}) : assert(primary || topPadding == 0.0),
assert(
!floating ||
(snapConfiguration == null &&
showOnScreenConfiguration == null) ||
vsync != null,
'vsync cannot be null when snapConfiguration or showOnScreenConfiguration is not null, and floating is true',
),
_bottomHeight = bottom?.preferredSize.height ?? 0.0;
final Widget? leading;
final bool automaticallyImplyLeading;
final Widget? title;
final List<Widget>? actions;
final Widget? flexibleSpace;
final PreferredSizeWidget? bottom;
final double? elevation;
final Color? shadowColor;
final Color? surfaceTintColor;
final bool forceElevated;
final Color? backgroundColor;
final Color? scrolledUnderBackgroundColor;
final Color? foregroundColor;
final Brightness? brightness;
final IconThemeData? iconTheme;
final IconThemeData? actionsIconTheme;
final TextTheme? textTheme;
final bool primary;
final bool? centerTitle;
final bool excludeHeaderSemantics;
final double? titleSpacing;
final double? expandedHeight;
final double collapsedHeight;
final double topPadding;
final bool floating;
final bool pinned;
final ShapeBorder? shape;
final double? toolbarHeight;
final double? leadingWidth;
final bool? backwardsCompatibility;
final TextStyle? toolbarTextStyle;
final TextStyle? titleTextStyle;
final SystemUiOverlayStyle? systemOverlayStyle;
final double _bottomHeight;
@override
double get minExtent => collapsedHeight;
@override
double get maxExtent => math.max(
topPadding +
(expandedHeight ?? (toolbarHeight ?? kToolbarHeight) + _bottomHeight),
minExtent);
@override
final TickerProvider vsync;
@override
final FloatingHeaderSnapConfiguration? snapConfiguration;
@override
final OverScrollHeaderStretchConfiguration? stretchConfiguration;
@override
final PersistentHeaderShowOnScreenConfiguration? showOnScreenConfiguration;
@override
Widget build(
BuildContext context, double shrinkOffset, bool overlapsContent) {
final double visibleMainHeight = maxExtent - shrinkOffset - topPadding;
final double extraToolbarHeight = math.max(
minExtent -
_bottomHeight -
topPadding -
(toolbarHeight ?? kToolbarHeight),
0.0);
final double visibleToolbarHeight =
visibleMainHeight - _bottomHeight - extraToolbarHeight;
final bool isScrolledUnder =
overlapsContent || (pinned && shrinkOffset > maxExtent - minExtent);
final bool isPinnedWithOpacityFade =
pinned && floating && bottom != null && extraToolbarHeight == 0.0;
final double toolbarOpacity = !pinned || isPinnedWithOpacityFade
? (visibleToolbarHeight / (toolbarHeight ?? kToolbarHeight))
.clamp(0.0, 1.0)
: 1.0;
final Widget appBar = FlexibleSpaceBar.createSettings(
minExtent: minExtent,
maxExtent: maxExtent,
currentExtent: math.max(minExtent, maxExtent - shrinkOffset),
toolbarOpacity: toolbarOpacity,
isScrolledUnder: isScrolledUnder,
child: Stack(
children: [
SizedBox(
width: double.infinity,
height: math.max(minExtent, maxExtent - shrinkOffset),
child: ClipRect(
child: BackdropFilter(
filter: Theme.of(context).appBarBlurFilter,
child: const ColoredBox(
color: Colors.transparent,
),
),
),
),
AppBar(
leading: leading,
automaticallyImplyLeading: automaticallyImplyLeading,
title: title,
actions: actions,
flexibleSpace: (title == null &&
flexibleSpace != null &&
!excludeHeaderSemantics)
? Semantics(
header: true,
child: flexibleSpace,
)
: flexibleSpace,
bottom: bottom,
elevation: forceElevated || isScrolledUnder ? elevation : 0.0,
scrolledUnderElevation: 0,
shadowColor: shadowColor,
surfaceTintColor: surfaceTintColor,
backgroundColor: isScrolledUnder
? scrolledUnderBackgroundColor
: backgroundColor,
foregroundColor: foregroundColor,
brightness: brightness,
iconTheme: iconTheme,
actionsIconTheme: actionsIconTheme,
textTheme: textTheme,
primary: primary,
centerTitle: centerTitle,
excludeHeaderSemantics: excludeHeaderSemantics,
titleSpacing: titleSpacing,
shape: shape,
toolbarOpacity: toolbarOpacity,
bottomOpacity: pinned
? 1.0
: ((visibleMainHeight / _bottomHeight).clamp(0.0, 1.0)),
toolbarHeight: toolbarHeight,
leadingWidth: leadingWidth,
backwardsCompatibility: backwardsCompatibility,
toolbarTextStyle: toolbarTextStyle,
titleTextStyle: titleTextStyle,
systemOverlayStyle: systemOverlayStyle,
),
],
),
);
return appBar;
}
@override
bool shouldRebuild(covariant _SliverAppBarDelegate oldDelegate) {
return leading != oldDelegate.leading ||
automaticallyImplyLeading != oldDelegate.automaticallyImplyLeading ||
title != oldDelegate.title ||
actions != oldDelegate.actions ||
flexibleSpace != oldDelegate.flexibleSpace ||
bottom != oldDelegate.bottom ||
_bottomHeight != oldDelegate._bottomHeight ||
elevation != oldDelegate.elevation ||
shadowColor != oldDelegate.shadowColor ||
backgroundColor != oldDelegate.backgroundColor ||
scrolledUnderBackgroundColor !=
oldDelegate.scrolledUnderBackgroundColor ||
foregroundColor != oldDelegate.foregroundColor ||
brightness != oldDelegate.brightness ||
iconTheme != oldDelegate.iconTheme ||
actionsIconTheme != oldDelegate.actionsIconTheme ||
textTheme != oldDelegate.textTheme ||
primary != oldDelegate.primary ||
centerTitle != oldDelegate.centerTitle ||
titleSpacing != oldDelegate.titleSpacing ||
expandedHeight != oldDelegate.expandedHeight ||
topPadding != oldDelegate.topPadding ||
pinned != oldDelegate.pinned ||
floating != oldDelegate.floating ||
vsync != oldDelegate.vsync ||
snapConfiguration != oldDelegate.snapConfiguration ||
stretchConfiguration != oldDelegate.stretchConfiguration ||
showOnScreenConfiguration != oldDelegate.showOnScreenConfiguration ||
forceElevated != oldDelegate.forceElevated ||
toolbarHeight != oldDelegate.toolbarHeight ||
leadingWidth != oldDelegate.leadingWidth ||
backwardsCompatibility != oldDelegate.backwardsCompatibility ||
toolbarTextStyle != oldDelegate.toolbarTextStyle ||
titleTextStyle != oldDelegate.titleTextStyle ||
systemOverlayStyle != oldDelegate.systemOverlayStyle;
}
@override
String toString() {
return '${describeIdentity(this)}(topPadding: ${topPadding.toStringAsFixed(1)}, bottomHeight: ${_bottomHeight.toStringAsFixed(1)}, ...)';
}
}

View file

@ -5,26 +5,18 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a
sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051
url: "https://pub.dev"
source: hosted
version: "61.0.0"
version: "64.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562
sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893"
url: "https://pub.dev"
source: hosted
version: "5.13.0"
analyzer_plugin:
dependency: transitive
description:
name: analyzer_plugin
sha256: c1d5f167683de03d5ab6c3b53fc9aeefc5d59476e7810ba7bbddff50c6f4392d
url: "https://pub.dev"
source: hosted
version: "0.11.2"
version: "6.2.0"
android_intent_plus:
dependency: "direct main"
description:
@ -34,14 +26,6 @@ packages:
url: "https://gitlab.com/nc-photos/plus_plugins"
source: git
version: "3.1.1"
ansicolor:
dependency: transitive
description:
name: ansicolor
sha256: "607f8fa9786f392043f169898923e6c59b4518242b68b8862eb8a8b7d9c30b4a"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
args:
dependency: transitive
description:
@ -54,10 +38,10 @@ packages:
dependency: transitive
description:
name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev"
source: hosted
version: "2.10.0"
version: "2.11.0"
battery_plus:
dependency: "direct main"
description:
@ -110,10 +94,10 @@ packages:
dependency: transitive
description:
name: build
sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777"
sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
url: "https://pub.dev"
source: hosted
version: "2.3.1"
version: "2.4.1"
build_config:
dependency: transitive
description:
@ -126,34 +110,34 @@ packages:
dependency: transitive
description:
name: build_daemon
sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169"
sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1"
url: "https://pub.dev"
source: hosted
version: "3.1.1"
version: "4.0.1"
build_resolvers:
dependency: transitive
description:
name: build_resolvers
sha256: "687cf90a3951affac1bd5f9ecb5e3e90b60487f3d9cdc359bb310f8876bb02a6"
sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
url: "https://pub.dev"
source: hosted
version: "2.0.10"
version: "2.4.2"
build_runner:
dependency: "direct dev"
description:
name: build_runner
sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727
sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22"
url: "https://pub.dev"
source: hosted
version: "2.3.3"
version: "2.4.9"
build_runner_core:
dependency: transitive
dependency: "direct dev"
description:
name: build_runner_core
sha256: "0671ad4162ed510b70d0eb4ad6354c249f8429cab4ae7a4cec86bbc2886eb76e"
sha256: "6d6ee4276b1c5f34f21fdf39425202712d2be82019983d52f351c94aafbc2c41"
url: "https://pub.dev"
source: hosted
version: "7.2.7+1"
version: "7.2.10"
built_collection:
dependency: transitive
description:
@ -174,34 +158,34 @@ packages:
dependency: "direct main"
description:
name: cached_network_image
sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15
sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f"
url: "https://pub.dev"
source: hosted
version: "3.2.3"
version: "3.3.1"
cached_network_image_platform_interface:
dependency: "direct main"
description:
name: cached_network_image_platform_interface
sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7
sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
version: "4.0.0"
cached_network_image_web:
dependency: transitive
description:
name: cached_network_image_web
sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0
sha256: "205d6a9f1862de34b93184f22b9d2d94586b2f05c581d546695e3d8f6a805cd7"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
version: "1.2.0"
characters:
dependency: transitive
description:
name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
version: "1.3.0"
checked_yaml:
dependency: transitive
description:
@ -238,10 +222,10 @@ packages:
dependency: "direct main"
description:
name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
url: "https://pub.dev"
source: hosted
version: "1.17.0"
version: "1.18.0"
connectivity_plus:
dependency: "direct main"
description:
@ -308,30 +292,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.17.3"
dart_code_metrics:
dependency: "direct dev"
description:
name: dart_code_metrics
sha256: "1dc1fa763b73ed52147bd91b015d81903edc3f227b77b1672fcddba43390ed18"
url: "https://pub.dev"
source: hosted
version: "5.7.5"
dart_code_metrics_presets:
dependency: transitive
description:
name: dart_code_metrics_presets
sha256: b71eadf02a3787ebd5c887623f83f6fdc204d45c75a081bd636c4104b3fd8b73
url: "https://pub.dev"
source: hosted
version: "1.8.0"
dart_style:
dependency: transitive
description:
name: dart_style
sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4"
sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
url: "https://pub.dev"
source: hosted
version: "2.2.4"
version: "2.3.6"
dbus:
dependency: transitive
description:
@ -385,18 +353,18 @@ packages:
dependency: "direct dev"
description:
name: drift
sha256: "21abd7b1c1a637a264f58f9f05c7b910d29c204aab1cbfcb4d9fada1e98a9303"
sha256: b50a8342c6ddf05be53bda1d246404cbad101b64dc73e8d6d1ac1090d119b4e2
url: "https://pub.dev"
source: hosted
version: "2.8.0"
version: "2.15.0"
dynamic_color:
dependency: "direct main"
description:
name: dynamic_color
sha256: de4798a7069121aee12d5895315680258415de9b00e717723a1bd73d58f0126d
sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d
url: "https://pub.dev"
source: hosted
version: "1.6.6"
version: "1.7.0"
equatable:
dependency: "direct main"
description:
@ -458,10 +426,10 @@ packages:
dependency: "direct main"
description:
name: flex_seed_scheme
sha256: e4168a6fc88a3e5bc3d6b7a748c6a6083eedc193d343ddc26bbad7fb1b258555
sha256: "4cee2f1d07259f77e8b36f4ec5f35499d19e74e17c7dce5b819554914082bc01"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
version: "1.5.0"
flutter:
dependency: "direct main"
description: flutter
@ -480,26 +448,18 @@ packages:
dependency: "direct main"
description:
name: flutter_bloc
sha256: e74efb89ee6945bcbce74a5b3a5a3376b088e5f21f55c263fc38cbdc6237faae
sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2
url: "https://pub.dev"
source: hosted
version: "8.1.3"
flutter_blurhash:
dependency: transitive
description:
name: flutter_blurhash
sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6"
url: "https://pub.dev"
source: hosted
version: "0.7.0"
version: "8.1.5"
flutter_cache_manager:
dependency: "direct main"
description:
name: flutter_cache_manager
sha256: "32cd900555219333326a2d0653aaaf8671264c29befa65bbd9856d204a4c9fb3"
sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba"
url: "https://pub.dev"
source: hosted
version: "3.3.0"
version: "3.3.1"
flutter_colorpicker:
dependency: "direct main"
description:
@ -581,10 +541,10 @@ packages:
dependency: transitive
description:
name: flutter_map
sha256: "09010e452bcd8c57ade1b936b79643c4fd599f93b00d1696630f0b919b6f374a"
sha256: cda8d72135b697f519287258b5294a57ce2f2a5ebf234f0e406aad4dc14c9399
url: "https://pub.dev"
source: hosted
version: "2.2.0"
version: "6.1.0"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
@ -624,10 +584,10 @@ packages:
dependency: "direct main"
description:
name: fluttertoast
sha256: "474f7d506230897a3cd28c965ec21c5328ae5605fc9c400cd330e9e9d6ac175c"
sha256: "81b68579e23fcbcada2db3d50302813d2371664afe6165bc78148050ab94bf66"
url: "https://pub.dev"
source: hosted
version: "8.2.2"
version: "8.2.5"
frontend_server_client:
dependency: transitive
description:
@ -645,7 +605,7 @@ packages:
source: hosted
version: "2.1.2"
google_maps_flutter:
dependency: "direct main"
dependency: transitive
description:
name: google_maps_flutter
sha256: abefcb1e5e5c96bdd8084939dda555257af272c7972902ca46d5631092c1df68
@ -704,10 +664,10 @@ packages:
dependency: "direct main"
description:
name: http
sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2"
sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba
url: "https://pub.dev"
source: hosted
version: "0.13.6"
version: "1.2.0"
http_multi_server:
dependency: transitive
description:
@ -737,10 +697,10 @@ packages:
dependency: "direct main"
description:
name: intl
sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91"
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
url: "https://pub.dev"
source: hosted
version: "0.17.0"
version: "0.18.1"
io:
dependency: transitive
description:
@ -786,10 +746,10 @@ packages:
dependency: transitive
description:
name: latlong2
sha256: "08ef7282ba9f76e8495e49e2dc4d653015ac929dce5f92b375a415d30b407ea0"
sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe"
url: "https://pub.dev"
source: hosted
version: "0.8.2"
version: "0.9.1"
lints:
dependency: transitive
description:
@ -806,6 +766,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.1"
logger:
dependency: transitive
description:
name: logger
sha256: af05cc8714f356fd1f3888fb6741cbe9fbe25cdb6eedbab80e1a6db21047d4a4
url: "https://pub.dev"
source: hosted
version: "2.3.0"
logging:
dependency: "direct main"
description:
@ -818,42 +786,42 @@ packages:
dependency: transitive
description:
name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
url: "https://pub.dev"
source: hosted
version: "0.12.13"
version: "0.12.16"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
url: "https://pub.dev"
source: hosted
version: "0.2.0"
version: "0.5.0"
memory_info:
dependency: "direct main"
description:
name: memory_info
sha256: "5cbdb0acb5b0089b5776a6cadd3adaaf989d1178718af2ae07eb62f7ecff9982"
sha256: "2d2150e070e1ceeb44d9ac3edad3d03d19022c4e0a4ddb08a3f8a494fc41d1c4"
url: "https://pub.dev"
source: hosted
version: "0.0.3"
version: "0.0.4"
memory_info_platform_interface:
dependency: transitive
description:
name: memory_info_platform_interface
sha256: "0a8c674ac7929d112987b4501ffda7cee7129c51827effa0bc24e5e460b9a201"
sha256: "07c5ad0625f9810fb378fabd69a38c19a800865e11433e767804ff9bd84796db"
url: "https://pub.dev"
source: hosted
version: "0.0.1"
version: "0.0.2"
meta:
dependency: transitive
description:
name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
url: "https://pub.dev"
source: hosted
version: "1.8.0"
version: "1.10.0"
mgrs_dart:
dependency: transitive
description:
@ -866,10 +834,10 @@ packages:
dependency: "direct main"
description:
name: mime
sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
version: "1.0.5"
mocktail:
dependency: transitive
description:
@ -882,10 +850,10 @@ packages:
dependency: "direct main"
description:
name: mutex
sha256: "03116a4e46282a671b46c12de649d72c0ed18188ffe12a8d0fc63e83f4ad88f4"
sha256: "8827da25de792088eb33e572115a5eb0d61d61a3c01acbc8bcbe76ed78f1a1f2"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
version: "3.1.0"
native_device_orientation:
dependency: "direct main"
description:
@ -1097,10 +1065,10 @@ packages:
dependency: "direct main"
description:
name: octo_image
sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143"
sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
version: "2.0.0"
package_config:
dependency: transitive
description:
@ -1137,74 +1105,66 @@ packages:
dependency: "direct main"
description:
name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
url: "https://pub.dev"
source: hosted
version: "1.8.2"
version: "1.8.3"
path_provider:
dependency: "direct main"
description:
name: path_provider
sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2"
sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161
url: "https://pub.dev"
source: hosted
version: "2.0.15"
version: "2.1.3"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86"
sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d
url: "https://pub.dev"
source: hosted
version: "2.0.27"
version: "2.2.4"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: "1995d88ec2948dac43edf8fe58eb434d35d22a2940ecee1a9fefcd62beee6eb3"
sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
url: "https://pub.dev"
source: hosted
version: "2.2.3"
version: "2.4.0"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: ffbb8cc9ed2c9ec0e4b7a541e56fd79b138e8f47d2fb86815f15358a349b3b57
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
source: hosted
version: "2.1.11"
version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec"
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev"
source: hosted
version: "2.0.6"
version: "2.1.2"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: d3f80b32e83ec208ac95253e0cd4d298e104fbc63cb29c5c69edaed43b0c69d6
sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
url: "https://pub.dev"
source: hosted
version: "2.1.6"
pedantic:
dependency: transitive
description:
name: pedantic
sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602"
url: "https://pub.dev"
source: hosted
version: "1.11.1"
version: "2.2.1"
petitparser:
dependency: transitive
description:
name: petitparser
sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4"
sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
url: "https://pub.dev"
source: hosted
version: "5.1.0"
version: "6.0.2"
platform:
dependency: transitive
description:
@ -1217,10 +1177,10 @@ packages:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc"
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
version: "2.1.8"
polylabel:
dependency: transitive
description:
@ -1237,14 +1197,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.5.1"
positioned_tap_detector_2:
dependency: transitive
description:
name: positioned_tap_detector_2
sha256: "52e06863ad3e1f82b058fd05054fc8c9caeeb3b47d5cea7a24bd9320746059c1"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
process:
dependency: transitive
description:
@ -1277,14 +1229,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.4"
pub_updater:
dependency: transitive
description:
name: pub_updater
sha256: "05ae70703e06f7fdeb05f7f02dd680b8aad810e87c756a618f33e1794635115c"
url: "https://pub.dev"
source: hosted
version: "0.3.0"
pubspec_parse:
dependency: transitive
description:
@ -1313,58 +1257,58 @@ packages:
dependency: "direct main"
description:
name: screen_brightness
sha256: "62fd61a64e68b32b98b840bad7d8b6822bbc40e63c2b569a5f85528484c86b41"
sha256: "7d4ac84ae26b37c01d6f5db7123a72db7933e1f2a2a8c369a51e08f81b3178d8"
url: "https://pub.dev"
source: hosted
version: "0.2.2"
version: "1.0.1"
screen_brightness_android:
dependency: transitive
description:
name: screen_brightness_android
sha256: "3df10961e3a9e968a5e076fe27e7f4741fa8a1d3950bdeb48cf121ed529d0caf"
sha256: "8c69d3ac475e4d625e7fa682a3a51a69ff59abe5b4a9e57f6ec7d830a6c69bd6"
url: "https://pub.dev"
source: hosted
version: "0.1.0+2"
version: "1.0.1"
screen_brightness_ios:
dependency: transitive
description:
name: screen_brightness_ios
sha256: "99adc3ca5490b8294284aad5fcc87f061ad685050e03cf45d3d018fe398fd9a2"
sha256: f08f70ca1ac3e30719764b5cfb8b3fe1e28163065018a41b3e6f243ab146c2f1
url: "https://pub.dev"
source: hosted
version: "0.1.0"
version: "1.0.1"
screen_brightness_macos:
dependency: transitive
description:
name: screen_brightness_macos
sha256: "64b34e7e3f4900d7687c8e8fb514246845a73ecec05ab53483ed025bd4a899fd"
sha256: "70c2efa4534e22b927e82693488f127dd4a0f008469fccf4f0eefe9061bbdd6a"
url: "https://pub.dev"
source: hosted
version: "0.1.0+1"
version: "1.0.1"
screen_brightness_platform_interface:
dependency: transitive
description:
name: screen_brightness_platform_interface
sha256: b211d07f0c96637a15fb06f6168617e18030d5d74ad03795dd8547a52717c171
sha256: "9f3ebf7f22d5487e7676fe9ddaf3fc55b6ff8057707cf6dc0121c7dfda346a16"
url: "https://pub.dev"
source: hosted
version: "0.1.0"
version: "1.0.1"
screen_brightness_windows:
dependency: transitive
description:
name: screen_brightness_windows
sha256: "80d90ecdc63fc0823f2ecb1be323471619287937e14210650d7b25ca181abd05"
sha256: c8e12a91cf6dd912a48bd41fcf749282a51afa17f536c3460d8d05702fb89ffa
url: "https://pub.dev"
source: hosted
version: "0.1.1"
version: "1.0.1"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
sha256: "16d3fb6b3692ad244a695c0183fca18cf81fd4b821664394a781de42386bf022"
sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180
url: "https://pub.dev"
source: hosted
version: "2.1.1"
version: "2.2.3"
shared_preferences_android:
dependency: transitive
description:
@ -1377,10 +1321,10 @@ packages:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: e014107bb79d6d3297196f4f2d0db54b5d1f85b8ea8ff63b8e8b391a02700feb
sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
version: "2.4.0"
shared_preferences_linux:
dependency: transitive
description:
@ -1393,10 +1337,10 @@ packages:
dependency: "direct main"
description:
name: shared_preferences_platform_interface
sha256: fb5cf25c0235df2d0640ac1b1174f6466bd311f621574997ac59018a6664548d
sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b"
url: "https://pub.dev"
source: hosted
version: "2.2.0"
version: "2.3.2"
shared_preferences_web:
dependency: transitive
description:
@ -1454,10 +1398,10 @@ packages:
dependency: "direct main"
description:
name: sliver_tools
sha256: ccdc502098a8bfa07b3ec582c282620031481300035584e1bb3aca296a505e8c
sha256: eae28220badfb9d0559207badcbbc9ad5331aac829a88cb0964d330d2a4636a6
url: "https://pub.dev"
source: hosted
version: "0.2.10"
version: "0.2.12"
smooth_corner:
dependency: "direct main"
description:
@ -1470,10 +1414,10 @@ packages:
dependency: transitive
description:
name: source_gen
sha256: "2d79738b6bbf38a43920e2b8d189e9a3ce6cc201f4b8fc76be5e4fe377b1c38d"
sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832"
url: "https://pub.dev"
source: hosted
version: "1.2.6"
version: "1.5.0"
source_map_stack_trace:
dependency: transitive
description:
@ -1494,10 +1438,10 @@ packages:
dependency: transitive
description:
name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
url: "https://pub.dev"
source: hosted
version: "1.9.1"
version: "1.10.0"
sqflite:
dependency: transitive
description:
@ -1518,34 +1462,34 @@ packages:
dependency: transitive
description:
name: sqlite3
sha256: "2cef47b59d310e56f8275b13734ee80a9cf4a48a43172020cb55a620121fbf66"
sha256: "072128763f1547e3e9b4735ce846bfd226d68019ccda54db4cd427b12dfdedc9"
url: "https://pub.dev"
source: hosted
version: "1.11.1"
version: "2.4.0"
sqlite3_flutter_libs:
dependency: transitive
description:
name: sqlite3_flutter_libs
sha256: "1e20a88d5c7ae8400e009f38ddbe8b001800a6dffa37832481a86a219bc904c7"
sha256: fb2a106a2ea6042fe57de2c47074cc31539a941819c91e105b864744605da3f5
url: "https://pub.dev"
source: hosted
version: "0.5.15"
version: "0.5.21"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
url: "https://pub.dev"
source: hosted
version: "1.11.0"
version: "1.11.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
url: "https://pub.dev"
source: hosted
version: "2.1.1"
version: "2.1.2"
stream_transform:
dependency: transitive
description:
@ -1566,10 +1510,10 @@ packages:
dependency: transitive
description:
name: synchronized
sha256: "5fcbd27688af6082f5abd611af56ee575342c30e87541d0245f7ff99faa02c60"
sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
version: "3.1.0+1"
term_glyph:
dependency: transitive
description:
@ -1582,26 +1526,26 @@ packages:
dependency: "direct dev"
description:
name: test
sha256: a5fcd2d25eeadbb6589e80198a47d6a464ba3e2049da473943b8af9797900c2d
sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f
url: "https://pub.dev"
source: hosted
version: "1.22.0"
version: "1.24.9"
test_api:
dependency: transitive
description:
name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
url: "https://pub.dev"
source: hosted
version: "0.4.16"
version: "0.6.1"
test_core:
dependency: transitive
description:
name: test_core
sha256: "0ef9755ec6d746951ba0aabe62f874b707690b5ede0fecc818b138fcc9b14888"
sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a
url: "https://pub.dev"
source: hosted
version: "0.4.20"
version: "0.5.9"
timing:
dependency: transitive
description:
@ -1632,10 +1576,10 @@ packages:
dependency: "direct main"
description:
name: tuple
sha256: "0ea99cd2f9352b2586583ab2ce6489d1f95a5f6de6fb9492faaf97ae2060f0aa"
sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151
url: "https://pub.dev"
source: hosted
version: "2.0.1"
version: "2.0.2"
typed_data:
dependency: transitive
description:
@ -1664,66 +1608,66 @@ packages:
dependency: "direct main"
description:
name: url_launcher
sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3
sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e"
url: "https://pub.dev"
source: hosted
version: "6.1.11"
version: "6.2.6"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
sha256: "1a5848f598acc5b7d8f7c18b8cb834ab667e59a13edc3c93e9d09cf38cc6bc87"
sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775"
url: "https://pub.dev"
source: hosted
version: "6.0.34"
version: "6.3.1"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2"
sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89"
url: "https://pub.dev"
source: hosted
version: "6.1.4"
version: "6.3.0"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5"
sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.1.1"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
sha256: "91ee3e75ea9dadf38036200c5d3743518f4a5eb77a8d13fda1ee5764373f185e"
sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.2.0"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370"
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.3.2"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
sha256: "6bb1e5d7fe53daf02a8fee85352432a40b1f868a81880e99ec7440113d5cfcab"
sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b
url: "https://pub.dev"
source: hosted
version: "2.0.17"
version: "2.2.3"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: "254708f17f7c20a9c8c471f67d86d76d4a3f9c1591aad1e15292008aceb82771"
sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7
url: "https://pub.dev"
source: hosted
version: "3.0.6"
version: "3.1.1"
uuid:
dependency: "direct main"
description:
@ -1818,10 +1762,18 @@ packages:
dependency: transitive
description:
name: watcher
sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0"
sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
version: "1.1.0"
web:
dependency: transitive
description:
name: web
sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
url: "https://pub.dev"
source: hosted
version: "0.3.0"
web_socket_channel:
dependency: transitive
description:
@ -1882,10 +1834,10 @@ packages:
dependency: transitive
description:
name: xml
sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5"
sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
url: "https://pub.dev"
source: hosted
version: "6.2.2"
version: "6.5.0"
yaml:
dependency: transitive
description:
@ -1895,5 +1847,5 @@ packages:
source: hosted
version: "3.1.2"
sdks:
dart: ">=2.19.6 <3.0.0"
flutter: ">=3.7.0"
dart: ">=3.2.3 <4.0.0"
flutter: ">=3.16.6"

View file

@ -18,8 +18,8 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.65.0+6500
environment:
sdk: ">=2.17.0 <3.0.0"
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:
@ -35,11 +35,11 @@ dependencies:
path: packages/android_intent_plus
battery_plus: ^4.0.1
bloc_concurrency: ^0.2.2
cached_network_image: ^3.2.3
cached_network_image: ^3.3.1
cached_network_image_platform_interface: any
circular_reveal_animation: ^2.0.1
clock: ^1.1.1
collection: ^1.15.0
collection: ^1.18.0
connectivity_plus: ^3.0.6
copy_with:
git:
@ -52,20 +52,20 @@ dependencies:
git:
url: https://gitlab.com/nc-photos/flutter-draggable-scrollbar
ref: v0.1.0-nc-photos-8
dynamic_color: ^1.6.6
dynamic_color: ^1.7.0
equatable: ^2.0.5
event_bus: ^2.0.0
exifdart:
git:
url: https://gitlab.com/nc-photos/exifdart.git
ref: 1.3.0
flex_seed_scheme: ^1.3.0
fluttertoast: ^8.2.1
flex_seed_scheme: ^1.5.0
fluttertoast: ^8.2.5
flutter_background_service:
git:
url: https://gitlab.com/nc-photos/flutter_background_service.git
ref: v0.2.6-nc-photos-2
flutter_bloc: ^8.1.2
flutter_bloc: ^8.1.5
flutter_cache_manager: any
flutter_colorpicker: ^1.0.3
flutter_isolate: ^2.0.4
@ -74,20 +74,18 @@ dependencies:
url: https://gitlab.com/nc-photos/flutter_staggered_grid_view
ref: v0.4.0-nc-photos-2
flutter_typeahead: ^4.0.0
# android/ios only
google_maps_flutter: ^2.2.8
http: ^0.13.5
http: ^1.1.2
image_size_getter:
git:
url: https://gitlab.com/nc-photos/dart_image_size_getter
ref: 1.0.0-nc-photos-2
path: library
intl: ^0.17.0
intl: 0.18.1
kiwi: ^4.1.0
logging: ^1.1.1
memory_info: ^0.0.3
mime: ^1.0.4
mutex: ^3.0.1
logging: ^1.2.0
memory_info: ^0.0.4
mime: ^1.0.5
mutex: ^3.1.0
native_device_orientation: ^1.1.0
nc_photos_plugin:
path: ../plugin
@ -135,22 +133,22 @@ dependencies:
path: ../np_universal_storage
octo_image: any
page_view_indicators: ^2.0.0
path: ^1.8.0
path_provider: ^2.0.15
path: ^1.8.3
path_provider: ^2.1.3
provider: any
rxdart: ^0.27.7
screen_brightness: ^0.2.2
shared_preferences: ^2.0.8
screen_brightness: ^1.0.1
shared_preferences: ^2.2.3
shared_preferences_platform_interface: any
sliver_tools: ^0.2.10
sliver_tools: ^0.2.12
smooth_corner: ^1.1.0
to_string:
git:
url: https://gitlab.com/nkming2/dart-to-string
ref: to_string-1.0.0
path: to_string
tuple: ^2.0.1
url_launcher: ^6.1.11
tuple: ^2.0.2
url_launcher: ^6.2.6
uuid: ^3.0.7
video_player: 2.4.5
visibility_detector: ^0.4.0+2
@ -170,16 +168,16 @@ dependency_overrides:
path: packages/video_player/video_player_android
dev_dependencies:
test: any
test: ^1.22.1
bloc_test: any
build_runner: ^2.2.1
build_runner: ^2.4.9
build_runner_core: ">=7.2.9"
copy_with_build:
git:
url: https://gitlab.com/nkming2/dart-copy-with
path: copy_with_build
ref: copy_with_build-1.7.0
dart_code_metrics: any
drift: 2.8.0
drift: 2.15.0
flutter_test:
sdk: flutter
# integration_test:

View file

@ -4,7 +4,7 @@ version: 1.0.0
# homepage: https://www.example.com
environment:
sdk: '>=2.17.0 <3.0.0'
sdk: ">=3.2.0 <4.0.0"
dev_dependencies:
np_lints:

View file

@ -21,7 +21,7 @@ class DriftTableSortGenerator extends GeneratorForAnnotation<DriftTableSort> {
final driftTableSort =
DriftTableSort(annotation.read("dbClass").stringValue);
final clazz = element;
if (!clazz.allSupertypes.any((t) => t.element2.name == "Table")) {
if (!clazz.allSupertypes.any((t) => t.element.name == "Table")) {
print("Not a drift table");
return null;
}
@ -63,7 +63,7 @@ extension ${sortEnumName}IterableExtension on Iterable<$sortEnumName> {
return false;
}
// it's a very rough way but well...
if (field.type.element2?.name?.endsWith("Column") ?? false) {
if (field.type.element?.name?.endsWith("Column") ?? false) {
return true;
}
return false;

View file

@ -29,7 +29,7 @@ extension _\$${clazz.name}NpLog on ${clazz.name} {
} else if (element is ExtensionElement) {
final extension = element;
return """
extension _\$${extension.name}NpLog on ${extension.extendedType.element2!.name} {
extension _\$${extension.name}NpLog on ${extension.extendedType.element!.name} {
// ignore: unused_element
Logger get _log => log;

View file

@ -5,10 +5,10 @@ version: 1.0.0
publish_to: none
environment:
sdk: '>=2.17.0 <3.0.0'
sdk: ">=3.2.0 <4.0.0"
dependencies:
analyzer: '>=4.0.0'
analyzer: ^6.2.0
build: ^2.3.1
np_codegen:
path: ../codegen
@ -18,6 +18,6 @@ dev_dependencies:
build_test: ^2.1.5
np_lints:
path: ../np_lints
path: any
path: ^1.8.3
rxdart: any
test: any
test: ^1.22.1

View file

@ -5,15 +5,15 @@ homepage:
publish_to: none
environment:
sdk: '>=2.18.0 <3.0.0'
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
equatable: ^2.0.5
flutter:
sdk: flutter
http: ^0.13.5
logging: any
http: ^1.1.2
logging: ^1.2.0
np_codegen:
path: ../codegen
np_common:
@ -27,15 +27,16 @@ dependencies:
url: https://gitlab.com/nkming2/dart-to-string
ref: to_string-1.0.0
path: to_string
xml: ^6.1.0
xml: ^6.5.0
dev_dependencies:
build_runner: ^2.2.1
build_runner: ^2.4.9
build_runner_core: ">=7.2.9"
np_codegen_build:
path: ../codegen_build
np_lints:
path: ../np_lints
test: any
test: ^1.22.1
to_string_build:
git:
url: https://gitlab.com/nkming2/dart-to-string

View file

@ -5,8 +5,8 @@ homepage:
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:

View file

@ -5,16 +5,16 @@ version: 1.0.0
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
sdk: ">=3.2.0 <4.0.0"
dependencies:
collection: ^1.15.0
collection: ^1.18.0
np_math:
path: ../np_math
quiver: ^3.2.1
tuple: ^2.0.1
tuple: ^2.0.2
dev_dependencies:
np_lints:
path: ../np_lints
test: ^1.21.0
test: ^1.22.1

View file

@ -5,7 +5,7 @@ homepage:
publish_to: none
environment:
sdk: '>=2.18.0 <3.0.0'
sdk: ">=3.2.0 <4.0.0"
dependencies:
to_string:
@ -15,10 +15,12 @@ dependencies:
path: to_string
dev_dependencies:
build_runner: ^2.2.1
analyzer: ^6.2.0
build_runner: ^2.4.9
build_runner_core: ">=7.2.9"
np_lints:
path: ../np_lints
test: ^1.21.0
test: ^1.22.1
to_string_build:
git:
url: https://gitlab.com/nkming2/dart-to-string

View file

@ -5,7 +5,7 @@ version: 1.0.0
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
sdk: ">=3.2.0 <4.0.0"
dependencies:
clock: ^1.1.1
@ -13,4 +13,4 @@ dependencies:
dev_dependencies:
np_lints:
path: ../np_lints
test: ^1.21.0
test: ^1.22.1

View file

@ -5,8 +5,8 @@ version: 1.0.0
publish_to: 'none'
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.7.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
copy_with:
@ -17,7 +17,7 @@ dependencies:
equatable: ^2.0.5
flutter:
sdk: flutter
logging: ^1.1.1
logging: ^1.2.0
np_codegen:
path: ../codegen
np_collection:
@ -37,7 +37,8 @@ dependencies:
path: to_string
dev_dependencies:
build_runner: ^2.2.1
build_runner: ^2.4.9
build_runner_core: ">=7.2.9"
copy_with_build:
git:
url: https://gitlab.com/nkming2/dart-copy-with
@ -47,7 +48,7 @@ dev_dependencies:
path: ../codegen_build
np_lints:
path: ../np_lints
test: ^1.21.0
test: ^1.22.1
to_string_build:
git:
url: https://gitlab.com/nkming2/dart-to-string

View file

@ -28,9 +28,10 @@ class $ServersTable extends Servers with TableInfo<$ServersTable, Server> {
@override
List<GeneratedColumn> get $columns => [rowId, address];
@override
String get aliasedName => _alias ?? 'servers';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'servers';
String get actualTableName => $name;
static const String $name = 'servers';
@override
VerificationContext validateIntegrity(Insertable<Server> instance,
{bool isInserting = false}) {
@ -207,9 +208,10 @@ class $AccountsTable extends Accounts with TableInfo<$AccountsTable, Account> {
@override
List<GeneratedColumn> get $columns => [rowId, server, userId];
@override
String get aliasedName => _alias ?? 'accounts';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'accounts';
String get actualTableName => $name;
static const String $name = 'accounts';
@override
VerificationContext validateIntegrity(Insertable<Account> instance,
{bool isInserting = false}) {
@ -444,15 +446,12 @@ class $FilesTable extends Files with TableInfo<$FilesTable, File> {
static const VerificationMeta _isCollectionMeta =
const VerificationMeta('isCollection');
@override
late final GeneratedColumn<bool> isCollection =
GeneratedColumn<bool>('is_collection', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintsDependsOnDialect({
SqlDialect.sqlite: 'CHECK ("is_collection" IN (0, 1))',
SqlDialect.mysql: '',
SqlDialect.postgres: '',
}));
late final GeneratedColumn<bool> isCollection = GeneratedColumn<bool>(
'is_collection', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintIsAlways(
'CHECK ("is_collection" IN (0, 1))'));
static const VerificationMeta _usedBytesMeta =
const VerificationMeta('usedBytes');
@override
@ -462,15 +461,12 @@ class $FilesTable extends Files with TableInfo<$FilesTable, File> {
static const VerificationMeta _hasPreviewMeta =
const VerificationMeta('hasPreview');
@override
late final GeneratedColumn<bool> hasPreview =
GeneratedColumn<bool>('has_preview', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintsDependsOnDialect({
SqlDialect.sqlite: 'CHECK ("has_preview" IN (0, 1))',
SqlDialect.mysql: '',
SqlDialect.postgres: '',
}));
late final GeneratedColumn<bool> hasPreview = GeneratedColumn<bool>(
'has_preview', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintIsAlways(
'CHECK ("has_preview" IN (0, 1))'));
static const VerificationMeta _ownerIdMeta =
const VerificationMeta('ownerId');
@override
@ -499,9 +495,10 @@ class $FilesTable extends Files with TableInfo<$FilesTable, File> {
ownerDisplayName
];
@override
String get aliasedName => _alias ?? 'files';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'files';
String get actualTableName => $name;
static const String $name = 'files';
@override
VerificationContext validateIntegrity(Insertable<File> instance,
{bool isInserting = false}) {
@ -660,8 +657,8 @@ class File extends DataClass implements Insertable<File> {
map['etag'] = Variable<String>(etag);
}
if (!nullToAbsent || lastModified != null) {
final converter = $FilesTable.$converterlastModifiedn;
map['last_modified'] = Variable<DateTime>(converter.toSql(lastModified));
map['last_modified'] = Variable<DateTime>(
$FilesTable.$converterlastModifiedn.toSql(lastModified));
}
if (!nullToAbsent || isCollection != null) {
map['is_collection'] = Variable<bool>(isCollection);
@ -957,9 +954,8 @@ class FilesCompanion extends UpdateCompanion<File> {
map['etag'] = Variable<String>(etag.value);
}
if (lastModified.present) {
final converter = $FilesTable.$converterlastModifiedn;
map['last_modified'] =
Variable<DateTime>(converter.toSql(lastModified.value));
map['last_modified'] = Variable<DateTime>(
$FilesTable.$converterlastModifiedn.toSql(lastModified.value));
}
if (isCollection.present) {
map['is_collection'] = Variable<bool>(isCollection.value);
@ -1040,27 +1036,21 @@ class $AccountFilesTable extends AccountFiles
static const VerificationMeta _isFavoriteMeta =
const VerificationMeta('isFavorite');
@override
late final GeneratedColumn<bool> isFavorite =
GeneratedColumn<bool>('is_favorite', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintsDependsOnDialect({
SqlDialect.sqlite: 'CHECK ("is_favorite" IN (0, 1))',
SqlDialect.mysql: '',
SqlDialect.postgres: '',
}));
late final GeneratedColumn<bool> isFavorite = GeneratedColumn<bool>(
'is_favorite', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintIsAlways(
'CHECK ("is_favorite" IN (0, 1))'));
static const VerificationMeta _isArchivedMeta =
const VerificationMeta('isArchived');
@override
late final GeneratedColumn<bool> isArchived =
GeneratedColumn<bool>('is_archived', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintsDependsOnDialect({
SqlDialect.sqlite: 'CHECK ("is_archived" IN (0, 1))',
SqlDialect.mysql: '',
SqlDialect.postgres: '',
}));
late final GeneratedColumn<bool> isArchived = GeneratedColumn<bool>(
'is_archived', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintIsAlways(
'CHECK ("is_archived" IN (0, 1))'));
static const VerificationMeta _overrideDateTimeMeta =
const VerificationMeta('overrideDateTime');
@override
@ -1089,9 +1079,10 @@ class $AccountFilesTable extends AccountFiles
bestDateTime
];
@override
String get aliasedName => _alias ?? 'account_files';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'account_files';
String get actualTableName => $name;
static const String $name = 'account_files';
@override
VerificationContext validateIntegrity(Insertable<AccountFile> instance,
{bool isInserting = false}) {
@ -1214,13 +1205,13 @@ class AccountFile extends DataClass implements Insertable<AccountFile> {
map['is_archived'] = Variable<bool>(isArchived);
}
if (!nullToAbsent || overrideDateTime != null) {
final converter = $AccountFilesTable.$converteroverrideDateTimen;
map['override_date_time'] =
Variable<DateTime>(converter.toSql(overrideDateTime));
map['override_date_time'] = Variable<DateTime>($AccountFilesTable
.$converteroverrideDateTimen
.toSql(overrideDateTime));
}
{
final converter = $AccountFilesTable.$converterbestDateTime;
map['best_date_time'] = Variable<DateTime>(converter.toSql(bestDateTime));
map['best_date_time'] = Variable<DateTime>(
$AccountFilesTable.$converterbestDateTime.toSql(bestDateTime));
}
return map;
}
@ -1424,14 +1415,13 @@ class AccountFilesCompanion extends UpdateCompanion<AccountFile> {
map['is_archived'] = Variable<bool>(isArchived.value);
}
if (overrideDateTime.present) {
final converter = $AccountFilesTable.$converteroverrideDateTimen;
map['override_date_time'] =
Variable<DateTime>(converter.toSql(overrideDateTime.value));
map['override_date_time'] = Variable<DateTime>($AccountFilesTable
.$converteroverrideDateTimen
.toSql(overrideDateTime.value));
}
if (bestDateTime.present) {
final converter = $AccountFilesTable.$converterbestDateTime;
map['best_date_time'] =
Variable<DateTime>(converter.toSql(bestDateTime.value));
map['best_date_time'] = Variable<DateTime>(
$AccountFilesTable.$converterbestDateTime.toSql(bestDateTime.value));
}
return map;
}
@ -1514,9 +1504,10 @@ class $ImagesTable extends Images with TableInfo<$ImagesTable, Image> {
dateTimeOriginal
];
@override
String get aliasedName => _alias ?? 'images';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'images';
String get actualTableName => $name;
static const String $name = 'images';
@override
VerificationContext validateIntegrity(Insertable<Image> instance,
{bool isInserting = false}) {
@ -1608,8 +1599,8 @@ class Image extends DataClass implements Insertable<Image> {
final map = <String, Expression>{};
map['account_file'] = Variable<int>(accountFile);
{
final converter = $ImagesTable.$converterlastUpdated;
map['last_updated'] = Variable<DateTime>(converter.toSql(lastUpdated));
map['last_updated'] = Variable<DateTime>(
$ImagesTable.$converterlastUpdated.toSql(lastUpdated));
}
if (!nullToAbsent || fileEtag != null) {
map['file_etag'] = Variable<String>(fileEtag);
@ -1624,9 +1615,8 @@ class Image extends DataClass implements Insertable<Image> {
map['exif_raw'] = Variable<String>(exifRaw);
}
if (!nullToAbsent || dateTimeOriginal != null) {
final converter = $ImagesTable.$converterdateTimeOriginaln;
map['date_time_original'] =
Variable<DateTime>(converter.toSql(dateTimeOriginal));
map['date_time_original'] = Variable<DateTime>(
$ImagesTable.$converterdateTimeOriginaln.toSql(dateTimeOriginal));
}
return map;
}
@ -1800,9 +1790,8 @@ class ImagesCompanion extends UpdateCompanion<Image> {
map['account_file'] = Variable<int>(accountFile.value);
}
if (lastUpdated.present) {
final converter = $ImagesTable.$converterlastUpdated;
map['last_updated'] =
Variable<DateTime>(converter.toSql(lastUpdated.value));
map['last_updated'] = Variable<DateTime>(
$ImagesTable.$converterlastUpdated.toSql(lastUpdated.value));
}
if (fileEtag.present) {
map['file_etag'] = Variable<String>(fileEtag.value);
@ -1817,9 +1806,9 @@ class ImagesCompanion extends UpdateCompanion<Image> {
map['exif_raw'] = Variable<String>(exifRaw.value);
}
if (dateTimeOriginal.present) {
final converter = $ImagesTable.$converterdateTimeOriginaln;
map['date_time_original'] =
Variable<DateTime>(converter.toSql(dateTimeOriginal.value));
map['date_time_original'] = Variable<DateTime>($ImagesTable
.$converterdateTimeOriginaln
.toSql(dateTimeOriginal.value));
}
return map;
}
@ -1905,9 +1894,10 @@ class $ImageLocationsTable extends ImageLocations
admin2
];
@override
String get aliasedName => _alias ?? 'image_locations';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'image_locations';
String get actualTableName => $name;
static const String $name = 'image_locations';
@override
VerificationContext validateIntegrity(Insertable<ImageLocation> instance,
{bool isInserting = false}) {
@ -2284,9 +2274,10 @@ class $TrashesTable extends Trashes with TableInfo<$TrashesTable, Trash> {
List<GeneratedColumn> get $columns =>
[file, filename, originalLocation, deletionTime];
@override
String get aliasedName => _alias ?? 'trashes';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'trashes';
String get actualTableName => $name;
static const String $name = 'trashes';
@override
VerificationContext validateIntegrity(Insertable<Trash> instance,
{bool isInserting = false}) {
@ -2358,8 +2349,8 @@ class Trash extends DataClass implements Insertable<Trash> {
map['filename'] = Variable<String>(filename);
map['original_location'] = Variable<String>(originalLocation);
{
final converter = $TrashesTable.$converterdeletionTime;
map['deletion_time'] = Variable<DateTime>(converter.toSql(deletionTime));
map['deletion_time'] = Variable<DateTime>(
$TrashesTable.$converterdeletionTime.toSql(deletionTime));
}
return map;
}
@ -2488,9 +2479,8 @@ class TrashesCompanion extends UpdateCompanion<Trash> {
map['original_location'] = Variable<String>(originalLocation.value);
}
if (deletionTime.present) {
final converter = $TrashesTable.$converterdeletionTime;
map['deletion_time'] =
Variable<DateTime>(converter.toSql(deletionTime.value));
map['deletion_time'] = Variable<DateTime>(
$TrashesTable.$converterdeletionTime.toSql(deletionTime.value));
}
return map;
}
@ -2531,9 +2521,10 @@ class $DirFilesTable extends DirFiles with TableInfo<$DirFilesTable, DirFile> {
@override
List<GeneratedColumn> get $columns => [dir, child];
@override
String get aliasedName => _alias ?? 'dir_files';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'dir_files';
String get actualTableName => $name;
static const String $name = 'dir_files';
@override
VerificationContext validateIntegrity(Insertable<DirFile> instance,
{bool isInserting = false}) {
@ -2790,9 +2781,10 @@ class $AlbumsTable extends Albums with TableInfo<$AlbumsTable, Album> {
sortProviderContent
];
@override
String get aliasedName => _alias ?? 'albums';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'albums';
String get actualTableName => $name;
static const String $name = 'albums';
@override
VerificationContext validateIntegrity(Insertable<Album> instance,
{bool isInserting = false}) {
@ -2957,8 +2949,8 @@ class Album extends DataClass implements Insertable<Album> {
}
map['version'] = Variable<int>(version);
{
final converter = $AlbumsTable.$converterlastUpdated;
map['last_updated'] = Variable<DateTime>(converter.toSql(lastUpdated));
map['last_updated'] = Variable<DateTime>(
$AlbumsTable.$converterlastUpdated.toSql(lastUpdated));
}
map['name'] = Variable<String>(name);
map['provider_type'] = Variable<String>(providerType);
@ -3233,9 +3225,8 @@ class AlbumsCompanion extends UpdateCompanion<Album> {
map['version'] = Variable<int>(version.value);
}
if (lastUpdated.present) {
final converter = $AlbumsTable.$converterlastUpdated;
map['last_updated'] =
Variable<DateTime>(converter.toSql(lastUpdated.value));
map['last_updated'] = Variable<DateTime>(
$AlbumsTable.$converterlastUpdated.toSql(lastUpdated.value));
}
if (name.present) {
map['name'] = Variable<String>(name.value);
@ -3318,9 +3309,10 @@ class $AlbumSharesTable extends AlbumShares
@override
List<GeneratedColumn> get $columns => [album, userId, displayName, sharedAt];
@override
String get aliasedName => _alias ?? 'album_shares';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'album_shares';
String get actualTableName => $name;
static const String $name = 'album_shares';
@override
VerificationContext validateIntegrity(Insertable<AlbumShare> instance,
{bool isInserting = false}) {
@ -3394,8 +3386,8 @@ class AlbumShare extends DataClass implements Insertable<AlbumShare> {
map['display_name'] = Variable<String>(displayName);
}
{
final converter = $AlbumSharesTable.$convertersharedAt;
map['shared_at'] = Variable<DateTime>(converter.toSql(sharedAt));
map['shared_at'] = Variable<DateTime>(
$AlbumSharesTable.$convertersharedAt.toSql(sharedAt));
}
return map;
}
@ -3532,8 +3524,8 @@ class AlbumSharesCompanion extends UpdateCompanion<AlbumShare> {
map['display_name'] = Variable<String>(displayName.value);
}
if (sharedAt.present) {
final converter = $AlbumSharesTable.$convertersharedAt;
map['shared_at'] = Variable<DateTime>(converter.toSql(sharedAt.value));
map['shared_at'] = Variable<DateTime>(
$AlbumSharesTable.$convertersharedAt.toSql(sharedAt.value));
}
if (rowid.present) {
map['rowid'] = Variable<int>(rowid.value);
@ -3590,34 +3582,29 @@ class $TagsTable extends Tags with TableInfo<$TagsTable, Tag> {
static const VerificationMeta _userVisibleMeta =
const VerificationMeta('userVisible');
@override
late final GeneratedColumn<bool> userVisible =
GeneratedColumn<bool>('user_visible', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintsDependsOnDialect({
SqlDialect.sqlite: 'CHECK ("user_visible" IN (0, 1))',
SqlDialect.mysql: '',
SqlDialect.postgres: '',
}));
late final GeneratedColumn<bool> userVisible = GeneratedColumn<bool>(
'user_visible', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintIsAlways(
'CHECK ("user_visible" IN (0, 1))'));
static const VerificationMeta _userAssignableMeta =
const VerificationMeta('userAssignable');
@override
late final GeneratedColumn<bool> userAssignable =
GeneratedColumn<bool>('user_assignable', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintsDependsOnDialect({
SqlDialect.sqlite: 'CHECK ("user_assignable" IN (0, 1))',
SqlDialect.mysql: '',
SqlDialect.postgres: '',
}));
late final GeneratedColumn<bool> userAssignable = GeneratedColumn<bool>(
'user_assignable', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintIsAlways(
'CHECK ("user_assignable" IN (0, 1))'));
@override
List<GeneratedColumn> get $columns =>
[rowId, server, tagId, displayName, userVisible, userAssignable];
@override
String get aliasedName => _alias ?? 'tags';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'tags';
String get actualTableName => $name;
static const String $name = 'tags';
@override
VerificationContext validateIntegrity(Insertable<Tag> instance,
{bool isInserting = false}) {
@ -3949,9 +3936,10 @@ class $FaceRecognitionPersonsTable extends FaceRecognitionPersons
List<GeneratedColumn> get $columns =>
[rowId, account, name, thumbFaceId, count];
@override
String get aliasedName => _alias ?? 'face_recognition_persons';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'face_recognition_persons';
String get actualTableName => $name;
static const String $name = 'face_recognition_persons';
@override
VerificationContext validateIntegrity(
Insertable<FaceRecognitionPerson> instance,
@ -4274,15 +4262,12 @@ class $NcAlbumsTable extends NcAlbums with TableInfo<$NcAlbumsTable, NcAlbum> {
static const VerificationMeta _isOwnedMeta =
const VerificationMeta('isOwned');
@override
late final GeneratedColumn<bool> isOwned =
GeneratedColumn<bool>('is_owned', aliasedName, false,
type: DriftSqlType.bool,
requiredDuringInsert: true,
defaultConstraints: GeneratedColumn.constraintsDependsOnDialect({
SqlDialect.sqlite: 'CHECK ("is_owned" IN (0, 1))',
SqlDialect.mysql: '',
SqlDialect.postgres: '',
}));
late final GeneratedColumn<bool> isOwned = GeneratedColumn<bool>(
'is_owned', aliasedName, false,
type: DriftSqlType.bool,
requiredDuringInsert: true,
defaultConstraints:
GeneratedColumn.constraintIsAlways('CHECK ("is_owned" IN (0, 1))'));
@override
List<GeneratedColumn> get $columns => [
rowId,
@ -4297,9 +4282,10 @@ class $NcAlbumsTable extends NcAlbums with TableInfo<$NcAlbumsTable, NcAlbum> {
isOwned
];
@override
String get aliasedName => _alias ?? 'nc_albums';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'nc_albums';
String get actualTableName => $name;
static const String $name = 'nc_albums';
@override
VerificationContext validateIntegrity(Insertable<NcAlbum> instance,
{bool isInserting = false}) {
@ -4442,12 +4428,12 @@ class NcAlbum extends DataClass implements Insertable<NcAlbum> {
map['location'] = Variable<String>(location);
}
if (!nullToAbsent || dateStart != null) {
final converter = $NcAlbumsTable.$converterdateStartn;
map['date_start'] = Variable<DateTime>(converter.toSql(dateStart));
map['date_start'] = Variable<DateTime>(
$NcAlbumsTable.$converterdateStartn.toSql(dateStart));
}
if (!nullToAbsent || dateEnd != null) {
final converter = $NcAlbumsTable.$converterdateEndn;
map['date_end'] = Variable<DateTime>(converter.toSql(dateEnd));
map['date_end'] =
Variable<DateTime>($NcAlbumsTable.$converterdateEndn.toSql(dateEnd));
}
map['collaborators'] = Variable<String>(collaborators);
map['is_owned'] = Variable<bool>(isOwned);
@ -4681,12 +4667,12 @@ class NcAlbumsCompanion extends UpdateCompanion<NcAlbum> {
map['location'] = Variable<String>(location.value);
}
if (dateStart.present) {
final converter = $NcAlbumsTable.$converterdateStartn;
map['date_start'] = Variable<DateTime>(converter.toSql(dateStart.value));
map['date_start'] = Variable<DateTime>(
$NcAlbumsTable.$converterdateStartn.toSql(dateStart.value));
}
if (dateEnd.present) {
final converter = $NcAlbumsTable.$converterdateEndn;
map['date_end'] = Variable<DateTime>(converter.toSql(dateEnd.value));
map['date_end'] = Variable<DateTime>(
$NcAlbumsTable.$converterdateEndn.toSql(dateEnd.value));
}
if (collaborators.present) {
map['collaborators'] = Variable<String>(collaborators.value);
@ -4777,27 +4763,21 @@ class $NcAlbumItemsTable extends NcAlbumItems
static const VerificationMeta _hasPreviewMeta =
const VerificationMeta('hasPreview');
@override
late final GeneratedColumn<bool> hasPreview =
GeneratedColumn<bool>('has_preview', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintsDependsOnDialect({
SqlDialect.sqlite: 'CHECK ("has_preview" IN (0, 1))',
SqlDialect.mysql: '',
SqlDialect.postgres: '',
}));
late final GeneratedColumn<bool> hasPreview = GeneratedColumn<bool>(
'has_preview', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintIsAlways(
'CHECK ("has_preview" IN (0, 1))'));
static const VerificationMeta _isFavoriteMeta =
const VerificationMeta('isFavorite');
@override
late final GeneratedColumn<bool> isFavorite =
GeneratedColumn<bool>('is_favorite', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintsDependsOnDialect({
SqlDialect.sqlite: 'CHECK ("is_favorite" IN (0, 1))',
SqlDialect.mysql: '',
SqlDialect.postgres: '',
}));
late final GeneratedColumn<bool> isFavorite = GeneratedColumn<bool>(
'is_favorite', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintIsAlways(
'CHECK ("is_favorite" IN (0, 1))'));
static const VerificationMeta _fileMetadataWidthMeta =
const VerificationMeta('fileMetadataWidth');
@override
@ -4826,9 +4806,10 @@ class $NcAlbumItemsTable extends NcAlbumItems
fileMetadataHeight
];
@override
String get aliasedName => _alias ?? 'nc_album_items';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'nc_album_items';
String get actualTableName => $name;
static const String $name = 'nc_album_items';
@override
VerificationContext validateIntegrity(Insertable<NcAlbumItem> instance,
{bool isInserting = false}) {
@ -4994,8 +4975,8 @@ class NcAlbumItem extends DataClass implements Insertable<NcAlbumItem> {
map['etag'] = Variable<String>(etag);
}
if (!nullToAbsent || lastModified != null) {
final converter = $NcAlbumItemsTable.$converterlastModifiedn;
map['last_modified'] = Variable<DateTime>(converter.toSql(lastModified));
map['last_modified'] = Variable<DateTime>(
$NcAlbumItemsTable.$converterlastModifiedn.toSql(lastModified));
}
if (!nullToAbsent || hasPreview != null) {
map['has_preview'] = Variable<bool>(hasPreview);
@ -5292,9 +5273,8 @@ class NcAlbumItemsCompanion extends UpdateCompanion<NcAlbumItem> {
map['etag'] = Variable<String>(etag.value);
}
if (lastModified.present) {
final converter = $NcAlbumItemsTable.$converterlastModifiedn;
map['last_modified'] =
Variable<DateTime>(converter.toSql(lastModified.value));
map['last_modified'] = Variable<DateTime>(
$NcAlbumItemsTable.$converterlastModifiedn.toSql(lastModified.value));
}
if (hasPreview.present) {
map['has_preview'] = Variable<bool>(hasPreview.value);
@ -5363,9 +5343,10 @@ class $RecognizeFacesTable extends RecognizeFaces
@override
List<GeneratedColumn> get $columns => [rowId, account, label];
@override
String get aliasedName => _alias ?? 'recognize_faces';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'recognize_faces';
String get actualTableName => $name;
static const String $name = 'recognize_faces';
@override
VerificationContext validateIntegrity(Insertable<RecognizeFace> instance,
{bool isInserting = false}) {
@ -5609,15 +5590,12 @@ class $RecognizeFaceItemsTable extends RecognizeFaceItems
static const VerificationMeta _hasPreviewMeta =
const VerificationMeta('hasPreview');
@override
late final GeneratedColumn<bool> hasPreview =
GeneratedColumn<bool>('has_preview', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintsDependsOnDialect({
SqlDialect.sqlite: 'CHECK ("has_preview" IN (0, 1))',
SqlDialect.mysql: '',
SqlDialect.postgres: '',
}));
late final GeneratedColumn<bool> hasPreview = GeneratedColumn<bool>(
'has_preview', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintIsAlways(
'CHECK ("has_preview" IN (0, 1))'));
static const VerificationMeta _realPathMeta =
const VerificationMeta('realPath');
@override
@ -5627,15 +5605,12 @@ class $RecognizeFaceItemsTable extends RecognizeFaceItems
static const VerificationMeta _isFavoriteMeta =
const VerificationMeta('isFavorite');
@override
late final GeneratedColumn<bool> isFavorite =
GeneratedColumn<bool>('is_favorite', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintsDependsOnDialect({
SqlDialect.sqlite: 'CHECK ("is_favorite" IN (0, 1))',
SqlDialect.mysql: '',
SqlDialect.postgres: '',
}));
late final GeneratedColumn<bool> isFavorite = GeneratedColumn<bool>(
'is_favorite', aliasedName, true,
type: DriftSqlType.bool,
requiredDuringInsert: false,
defaultConstraints: GeneratedColumn.constraintIsAlways(
'CHECK ("is_favorite" IN (0, 1))'));
static const VerificationMeta _fileMetadataWidthMeta =
const VerificationMeta('fileMetadataWidth');
@override
@ -5672,9 +5647,10 @@ class $RecognizeFaceItemsTable extends RecognizeFaceItems
faceDetections
];
@override
String get aliasedName => _alias ?? 'recognize_face_items';
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => 'recognize_face_items';
String get actualTableName => $name;
static const String $name = 'recognize_face_items';
@override
VerificationContext validateIntegrity(Insertable<RecognizeFaceItem> instance,
{bool isInserting = false}) {
@ -5859,8 +5835,8 @@ class RecognizeFaceItem extends DataClass
map['etag'] = Variable<String>(etag);
}
if (!nullToAbsent || lastModified != null) {
final converter = $RecognizeFaceItemsTable.$converterlastModifiedn;
map['last_modified'] = Variable<DateTime>(converter.toSql(lastModified));
map['last_modified'] = Variable<DateTime>(
$RecognizeFaceItemsTable.$converterlastModifiedn.toSql(lastModified));
}
if (!nullToAbsent || hasPreview != null) {
map['has_preview'] = Variable<bool>(hasPreview);
@ -6198,9 +6174,9 @@ class RecognizeFaceItemsCompanion extends UpdateCompanion<RecognizeFaceItem> {
map['etag'] = Variable<String>(etag.value);
}
if (lastModified.present) {
final converter = $RecognizeFaceItemsTable.$converterlastModifiedn;
map['last_modified'] =
Variable<DateTime>(converter.toSql(lastModified.value));
map['last_modified'] = Variable<DateTime>($RecognizeFaceItemsTable
.$converterlastModifiedn
.toSql(lastModified.value));
}
if (hasPreview.present) {
map['has_preview'] = Variable<bool>(hasPreview.value);

View file

@ -11,17 +11,17 @@ Future<Map<String, dynamic>> getSqliteConnectionArgs() async => {};
QueryExecutor openSqliteConnectionWithArgs(Map<String, dynamic> args) =>
openSqliteConnection();
// Web is no longer supported. The code here has been updated to make it build
// with the latest sqlite3 package, but they are untested
QueryExecutor openSqliteConnection() {
return LazyDatabase(() async {
// Load wasm bundle
final response = await http.get(Uri.parse("sqlite3.wasm"));
// Create a virtual file system backed by IndexedDb with everything in
// `/drift/my_app/` being persisted.
final sqlite3 = await WasmSqlite3.load(response.bodyBytes);
final fs = await IndexedDbFileSystem.open(dbName: "nc-photos");
final sqlite3 = await WasmSqlite3.load(
response.bodyBytes,
SqliteEnvironment(fileSystem: fs),
);
sqlite3.registerVirtualFileSystem(fs, makeDefault: true);
// Then, open a database inside that persisted folder.
return WasmDatabase(

View file

@ -5,22 +5,22 @@ version: 1.0.0
publish_to: 'none'
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.7.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
clock: ^1.1.1
collection: ^1.15.0
collection: ^1.18.0
copy_with:
git:
url: https://gitlab.com/nkming2/dart-copy-with
path: copy_with
ref: copy_with-1.3.0
drift: 2.8.0
drift: 2.15.0
flutter:
sdk: flutter
http: ^0.13.5
logging: ^1.1.1
http: ^1.1.2
logging: ^1.2.0
np_async:
path: ../np_async
np_codegen:
@ -41,30 +41,31 @@ dependencies:
path: ../np_platform_util
np_string:
path: ../np_string
path: ^1.8.0
path_provider: ^2.0.15
sqlite3: any
sqlite3_flutter_libs: ^0.5.15
path: ^1.8.3
path_provider: ^2.1.3
sqlite3: ^2.3.0
sqlite3_flutter_libs: ^0.5.21
to_string:
git:
url: https://gitlab.com/nkming2/dart-to-string
ref: to_string-1.0.0
path: to_string
tuple: ^2.0.1
tuple: ^2.0.2
dev_dependencies:
build_runner: ^2.2.1
build_runner: ^2.4.9
build_runner_core: ">=7.2.9"
copy_with_build:
git:
url: https://gitlab.com/nkming2/dart-copy-with
path: copy_with_build
ref: copy_with_build-1.7.0
drift_dev: 2.8.0
drift_dev: 2.15.0
np_codegen_build:
path: ../codegen_build
np_lints:
path: ../np_lints
test: ^1.21.0
test: ^1.22.1
to_string_build:
git:
url: https://gitlab.com/nkming2/dart-to-string

View file

@ -2,28 +2,27 @@ import 'package:flutter/services.dart' show rootBundle;
import 'package:http/http.dart' as http;
import 'package:sqlite3/wasm.dart';
// Web is no longer supported. The code here has been updated to make it build
// with the latest sqlite3 package, but they are untested
Future<CommonDatabase> openRawSqliteDbFromAsset(
String assetRelativePath,
String outputFilename, {
bool isReadOnly = false,
}) async {
final response = await http.get(Uri.parse("sqlite3.wasm"));
final sqlite3 = await WasmSqlite3.load(response.bodyBytes);
final fs = await IndexedDbFileSystem.open(dbName: "nc-photos");
final sqlite3 = await WasmSqlite3.load(
response.bodyBytes,
SqliteEnvironment(fileSystem: fs),
);
sqlite3.registerVirtualFileSystem(fs, makeDefault: true);
if (!fs.exists("/app-file/$outputFilename")) {
if (fs.xAccess("/app-file/$outputFilename", SqlFlag.SQLITE_OPEN_READONLY) ==
0) {
// copy file from assets
final blob = await rootBundle.load("assets/$assetRelativePath");
final buffer = blob.buffer;
fs.createFile("/app-file/$outputFilename");
fs.write(
"/app-file/$outputFilename",
buffer.asUint8List(blob.offsetInBytes, blob.lengthInBytes),
0,
);
final f = fs.xOpen(Sqlite3Filename("/app-file/$outputFilename"),
SqlFlag.SQLITE_OPEN_CREATE | SqlFlag.SQLITE_OPEN_READWRITE);
f.file
.xWrite(buffer.asUint8List(blob.offsetInBytes, blob.lengthInBytes), 0);
await fs.flush();
}
return sqlite3.open("/app-file/$outputFilename");

View file

@ -5,19 +5,19 @@ homepage:
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:
sdk: flutter
collection: ^1.15.0
http: ^0.13.5
collection: ^1.18.0
http: ^1.1.2
kdtree:
git:
url: https://gitlab.com/nc-photos/kd-tree-dart.git
ref: 0.2.0-nc-photos-1
logging: ^1.1.1
logging: ^1.2.0
np_codegen:
path: ../codegen
np_collection:
@ -26,9 +26,9 @@ dependencies:
path: ../np_math
np_string:
path: ../np_string
path: ^1.8.0
path_provider: ^2.0.15
sqlite3: ^1.11.1
path: ^1.8.3
path_provider: ^2.1.3
sqlite3: ^2.3.0
to_string:
git:
url: https://gitlab.com/nkming2/dart-to-string
@ -36,7 +36,9 @@ dependencies:
path: to_string
dev_dependencies:
build_runner: ^2.2.1
analyzer: ^6.2.0
build_runner: ^2.4.9
build_runner_core: ">=7.2.9"
np_codegen_build:
path: ../codegen_build
np_lints:

View file

@ -29,35 +29,33 @@ class OsmGpsMap extends StatelessWidget {
child: IgnorePointer(
child: FlutterMap(
options: MapOptions(
center: centerLl,
zoom: zoom,
allowPanning: false,
enableScrollWheel: false,
interactiveFlags: InteractiveFlag.none,
),
nonRotatedChildren: [
AttributionWidget.defaultWidget(
source: "OpenStreetMap contributors",
initialCenter: centerLl,
initialZoom: zoom,
interactionOptions: const InteractionOptions(
flags: InteractiveFlag.none,
),
],
layers: [
TileLayerOptions(
),
children: [
TileLayer(
urlTemplate: "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
),
MarkerLayerOptions(
MarkerLayer(
markers: [
Marker(
width: pinSize,
height: pinSize,
point: centerLl,
anchorPos: AnchorPos.align(AnchorAlign.top),
builder: (_) => const Image(
alignment: Alignment.topCenter,
child: const Image(
image: AssetImage(
"packages/np_gps_map/assets/gps_map_pin.png"),
),
),
],
),
const SimpleAttributionWidget(
source: Text("OpenStreetMap contributors"),
),
],
),
),

View file

@ -5,20 +5,20 @@ homepage:
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:
sdk: flutter
flutter_map: ^2.2.0
flutter_map: ^6.1.0
google_maps_flutter: ^2.2.8
latlong2: any
np_async:
path: ../np_async
np_platform_util:
path: ../np_platform_util
tuple: ^2.0.1
tuple: ^2.0.2
url_launcher: ^6.1.11
dev_dependencies:

View file

@ -4,7 +4,7 @@ version: 1.0.0
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
sdk: ">=3.2.0 <4.0.0"
dependencies:
flutter_lints: ^2.0.0

View file

@ -4,10 +4,10 @@ version: 1.0.0
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
sdk: ">=3.2.0 <4.0.0"
dependencies:
logging: ^1.1.1
logging: ^1.2.0
dev_dependencies:
np_lints:

View file

@ -5,9 +5,9 @@ version: 1.0.0
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
sdk: ">=3.2.0 <4.0.0"
dev_dependencies:
np_lints:
path: ../np_lints
test: ^1.21.0
test: ^1.22.1

View file

@ -5,14 +5,14 @@ homepage:
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:
sdk: flutter
collection: ^1.15.0
logging: ^1.1.1
collection: ^1.18.0
logging: ^1.2.0
np_codegen:
path: ../codegen
np_platform_raw_image:
@ -24,7 +24,8 @@ dependencies:
path: to_string
dev_dependencies:
build_runner: ^2.2.1
build_runner: ^2.4.9
build_runner_core: ">=7.2.9"
np_codegen_build:
path: ../codegen_build
np_lints:

View file

@ -5,15 +5,15 @@ homepage:
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:
sdk: flutter
np_platform_util:
path: ../np_platform_util
synchronized: ^3.1.0
synchronized: ^3.1.0+1
dev_dependencies:
np_lints:

View file

@ -5,8 +5,8 @@ homepage:
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:

View file

@ -5,18 +5,19 @@ homepage:
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:
sdk: flutter
logging: ^1.1.1
logging: ^1.2.0
np_codegen:
path: ../codegen
dev_dependencies:
build_runner: ^2.2.1
build_runner: ^2.4.9
build_runner_core: ">=7.2.9"
np_codegen_build:
path: ../codegen_build
np_lints:

View file

@ -5,13 +5,13 @@ homepage:
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:
sdk: flutter
logging: ^1.1.1
logging: ^1.2.0
dev_dependencies:
np_lints:

View file

@ -5,8 +5,8 @@ homepage:
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:

View file

@ -5,8 +5,8 @@ homepage:
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:

View file

@ -5,9 +5,9 @@ version: 1.0.0
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
sdk: ">=3.2.0 <4.0.0"
dev_dependencies:
np_lints:
path: ../np_lints
test: ^1.21.0
test: ^1.22.1

View file

@ -10,4 +10,5 @@ export 'src/pixel_image_provider.dart';
export 'src/shimmer.dart';
export 'src/stateful_slider.dart';
export 'src/switch_form_field.dart';
export 'src/translucent_sliver_app_bar.dart';
export 'src/unbounded_list_tile.dart';

View file

@ -17,8 +17,7 @@ class PixelImage extends ImageProvider<PixelImage> {
SynchronousFuture<PixelImage>(this);
@override
ImageStreamCompleter loadBuffer(
PixelImage key, DecoderBufferCallback decode) =>
ImageStreamCompleter loadImage(PixelImage key, ImageDecoderCallback decode) =>
OneFrameImageStreamCompleter(_createImageInfo());
Future<ImageInfo> _createImageInfo() async {

File diff suppressed because it is too large Load diff

View file

@ -4,8 +4,8 @@ version: 0.0.1
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:

View file

@ -5,17 +5,17 @@ homepage:
publish_to: none
environment:
sdk: '>=2.19.6 <3.0.0'
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:
sdk: flutter
np_string:
path: ../np_string
path: ^1.8.0
path_provider: ^2.0.15
shared_preferences: ^2.0.8
path: ^1.8.3
path_provider: ^2.1.3
shared_preferences: ^2.2.3
dev_dependencies:
np_lints:

View file

@ -4,13 +4,13 @@ version: 0.0.1
homepage:
environment:
sdk: ">=2.17.0 <3.0.0"
flutter: ">=3.3.0"
sdk: ">=3.2.0 <4.0.0"
flutter: ">=3.16.0"
dependencies:
flutter:
sdk: flutter
logging: any
logging: ^1.2.0
dev_dependencies:
np_lints: