upgraded Flutter to stable v3.3.3
This commit is contained in:
parent
3d0e079df2
commit
034934c8d0
20 changed files with 267 additions and 122 deletions
2
.github/workflows/check.yml
vendored
2
.github/workflows/check.yml
vendored
|
@ -17,7 +17,7 @@ jobs:
|
||||||
# Available versions may lag behind https://github.com/flutter/flutter.git
|
# Available versions may lag behind https://github.com/flutter/flutter.git
|
||||||
- uses: subosito/flutter-action@v2
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: '3.3.2'
|
flutter-version: '3.3.3'
|
||||||
channel: 'stable'
|
channel: 'stable'
|
||||||
|
|
||||||
- name: Clone the repository.
|
- name: Clone the repository.
|
||||||
|
|
10
.github/workflows/release.yml
vendored
10
.github/workflows/release.yml
vendored
|
@ -19,7 +19,7 @@ jobs:
|
||||||
# Available versions may lag behind https://github.com/flutter/flutter.git
|
# Available versions may lag behind https://github.com/flutter/flutter.git
|
||||||
- uses: subosito/flutter-action@v2
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: '3.3.2'
|
flutter-version: '3.3.3'
|
||||||
channel: 'stable'
|
channel: 'stable'
|
||||||
|
|
||||||
# Workaround for this Android Gradle Plugin issue (supposedly fixed in AGP 4.1):
|
# Workaround for this Android Gradle Plugin issue (supposedly fixed in AGP 4.1):
|
||||||
|
@ -56,15 +56,15 @@ jobs:
|
||||||
rm release.keystore.asc
|
rm release.keystore.asc
|
||||||
mkdir outputs
|
mkdir outputs
|
||||||
(cd scripts/; ./apply_flavor_play.sh)
|
(cd scripts/; ./apply_flavor_play.sh)
|
||||||
flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.2.sksl.json
|
flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.3.sksl.json
|
||||||
cp build/app/outputs/bundle/playRelease/*.aab outputs
|
cp build/app/outputs/bundle/playRelease/*.aab outputs
|
||||||
flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.2.sksl.json
|
flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.3.sksl.json
|
||||||
cp build/app/outputs/apk/play/release/*.apk outputs
|
cp build/app/outputs/apk/play/release/*.apk outputs
|
||||||
(cd scripts/; ./apply_flavor_huawei.sh)
|
(cd scripts/; ./apply_flavor_huawei.sh)
|
||||||
flutter build apk -t lib/main_huawei.dart --flavor huawei --bundle-sksl-path shaders_3.3.2.sksl.json
|
flutter build apk -t lib/main_huawei.dart --flavor huawei --bundle-sksl-path shaders_3.3.3.sksl.json
|
||||||
cp build/app/outputs/apk/huawei/release/*.apk outputs
|
cp build/app/outputs/apk/huawei/release/*.apk outputs
|
||||||
(cd scripts/; ./apply_flavor_izzy.sh)
|
(cd scripts/; ./apply_flavor_izzy.sh)
|
||||||
flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_3.3.2.sksl.json
|
flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_3.3.3.sksl.json
|
||||||
cp build/app/outputs/apk/izzy/release/*.apk outputs
|
cp build/app/outputs/apk/izzy/release/*.apk outputs
|
||||||
rm $AVES_STORE_FILE
|
rm $AVES_STORE_FILE
|
||||||
env:
|
env:
|
||||||
|
|
|
@ -16,6 +16,10 @@ All notable changes to this project will be documented in this file.
|
||||||
- Widget: tap action setting
|
- Widget: tap action setting
|
||||||
- Wallpaper: scroll effect option
|
- Wallpaper: scroll effect option
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- upgraded Flutter to stable v3.3.3
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- restoring to missing Download subdir
|
- restoring to missing Download subdir
|
||||||
|
|
|
@ -164,12 +164,12 @@ dependencies {
|
||||||
implementation 'com.github.deckerst:Android-TiffBitmapFactory:876e53870a'
|
implementation 'com.github.deckerst:Android-TiffBitmapFactory:876e53870a'
|
||||||
// forked, built by JitPack, cf https://jitpack.io/p/deckerst/pixymeta-android
|
// forked, built by JitPack, cf https://jitpack.io/p/deckerst/pixymeta-android
|
||||||
implementation 'com.github.deckerst:pixymeta-android:706bd73d6e'
|
implementation 'com.github.deckerst:pixymeta-android:706bd73d6e'
|
||||||
implementation 'com.github.bumptech.glide:glide:4.13.2'
|
implementation 'com.github.bumptech.glide:glide:4.14.1'
|
||||||
|
|
||||||
// huawei flavor only
|
// huawei flavor only
|
||||||
huaweiImplementation 'com.huawei.agconnect:agconnect-core:1.5.2.300'
|
huaweiImplementation 'com.huawei.agconnect:agconnect-core:1.5.2.300'
|
||||||
|
|
||||||
kapt 'androidx.annotation:annotation:1.4.0'
|
kapt 'androidx.annotation:annotation:1.5.0'
|
||||||
kapt 'com.github.bumptech.glide:compiler:4.13.0'
|
kapt 'com.github.bumptech.glide:compiler:4.13.0'
|
||||||
|
|
||||||
compileOnly rootProject.findProject(':streams_channel')
|
compileOnly rootProject.findProject(':streams_channel')
|
||||||
|
|
|
@ -21,7 +21,7 @@ class AvesAppGlideModule : AppGlideModule() {
|
||||||
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
|
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
|
||||||
// prevent ExifInterface error logs
|
// prevent ExifInterface error logs
|
||||||
// cf https://github.com/bumptech/glide/issues/3383
|
// cf https://github.com/bumptech/glide/issues/3383
|
||||||
glide.registry.imageHeaderParsers.compatRemoveIf { parser: ImageHeaderParser? -> parser is ExifInterfaceImageHeaderParser }
|
registry.imageHeaderParsers.compatRemoveIf { parser: ImageHeaderParser? -> parser is ExifInterfaceImageHeaderParser }
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun isManifestParsingEnabled(): Boolean = false
|
override fun isManifestParsingEnabled(): Boolean = false
|
||||||
|
|
|
@ -48,7 +48,7 @@ class OverlaySnackBar extends StatelessWidget {
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
final contentTextStyle = snackBarTheme.contentTextStyle ?? ThemeData(brightness: brightness).textTheme.subtitle1;
|
final contentTextStyle = snackBarTheme.contentTextStyle ?? ThemeData(brightness: brightness).textTheme.titleMedium;
|
||||||
|
|
||||||
final horizontalPadding = FeedbackMixin.snackBarHorizontalPadding(snackBarTheme);
|
final horizontalPadding = FeedbackMixin.snackBarHorizontalPadding(snackBarTheme);
|
||||||
final padding = EdgeInsetsDirectional.only(start: horizontalPadding, end: action != null ? 0 : horizontalPadding);
|
final padding = EdgeInsetsDirectional.only(start: horizontalPadding, end: action != null ? 0 : horizontalPadding);
|
||||||
|
|
|
@ -14,7 +14,7 @@ class SliverAppBarTitleWrapper extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final toolbarOpacity = context.dependOnInheritedWidgetOfExactType<FlexibleSpaceBarSettings>()!.toolbarOpacity;
|
final toolbarOpacity = context.dependOnInheritedWidgetOfExactType<FlexibleSpaceBarSettings>()!.toolbarOpacity;
|
||||||
final baseColor = (DefaultTextStyle.of(context).style.color ?? Theme.of(context).textTheme.headline6!.color!);
|
final baseColor = (DefaultTextStyle.of(context).style.color ?? Theme.of(context).textTheme.titleLarge!.color!);
|
||||||
return DefaultTextStyle.merge(
|
return DefaultTextStyle.merge(
|
||||||
style: TextStyle(color: baseColor.withOpacity(toolbarOpacity)),
|
style: TextStyle(color: baseColor.withOpacity(toolbarOpacity)),
|
||||||
child: child,
|
child: child,
|
||||||
|
|
|
@ -4,7 +4,7 @@ import 'dart:math' as math;
|
||||||
import 'package:flutter/gestures.dart';
|
import 'package:flutter/gestures.dart';
|
||||||
|
|
||||||
// adapted from Flutter `ScaleGestureRecognizer` in `/gestures/scale.dart`
|
// adapted from Flutter `ScaleGestureRecognizer` in `/gestures/scale.dart`
|
||||||
// ignore_for_file: curly_braces_in_flow_control_structures, deprecated_member_use, unnecessary_null_comparison
|
// ignore_for_file: avoid_types_on_closure_parameters, unnecessary_null_comparison
|
||||||
|
|
||||||
/// The possible states of a [ScaleGestureRecognizer].
|
/// The possible states of a [ScaleGestureRecognizer].
|
||||||
enum _ScaleState {
|
enum _ScaleState {
|
||||||
|
@ -25,6 +25,17 @@ enum _ScaleState {
|
||||||
started,
|
started,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class _PointerPanZoomData {
|
||||||
|
_PointerPanZoomData({required this.focalPoint, required this.scale, required this.rotation});
|
||||||
|
|
||||||
|
Offset focalPoint;
|
||||||
|
double scale;
|
||||||
|
double rotation;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => '_PointerPanZoomData(focalPoint: $focalPoint, scale: $scale, angle: $rotation)';
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
bool _isFlingGesture(Velocity velocity) {
|
bool _isFlingGesture(Velocity velocity) {
|
||||||
|
@ -71,20 +82,15 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
///
|
///
|
||||||
/// {@macro flutter.gestures.GestureRecognizer.supportedDevices}
|
/// {@macro flutter.gestures.GestureRecognizer.supportedDevices}
|
||||||
EagerScaleGestureRecognizer({
|
EagerScaleGestureRecognizer({
|
||||||
Object? debugOwner,
|
super.debugOwner,
|
||||||
@Deprecated(
|
@Deprecated(
|
||||||
'Migrate to supportedDevices. '
|
'Migrate to supportedDevices. '
|
||||||
'This feature was deprecated after v2.3.0-1.0.pre.',
|
'This feature was deprecated after v2.3.0-1.0.pre.',
|
||||||
)
|
)
|
||||||
PointerDeviceKind? kind,
|
super.kind,
|
||||||
Set<PointerDeviceKind>? supportedDevices,
|
super.supportedDevices,
|
||||||
this.dragStartBehavior = DragStartBehavior.down,
|
this.dragStartBehavior = DragStartBehavior.down,
|
||||||
}) : assert(dragStartBehavior != null),
|
}) : assert(dragStartBehavior != null);
|
||||||
super(
|
|
||||||
debugOwner: debugOwner,
|
|
||||||
kind: kind,
|
|
||||||
supportedDevices: supportedDevices,
|
|
||||||
);
|
|
||||||
|
|
||||||
/// Determines what point is used as the starting point in all calculations
|
/// Determines what point is used as the starting point in all calculations
|
||||||
/// involving this gesture.
|
/// involving this gesture.
|
||||||
|
@ -142,21 +148,51 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
late Offset _localFocalPoint;
|
late Offset _localFocalPoint;
|
||||||
_LineBetweenPointers? _initialLine;
|
_LineBetweenPointers? _initialLine;
|
||||||
_LineBetweenPointers? _currentLine;
|
_LineBetweenPointers? _currentLine;
|
||||||
late Map<int, Offset> _pointerLocations;
|
final Map<int, Offset> _pointerLocations = <int, Offset>{};
|
||||||
late List<int> _pointerQueue; // A queue to sort pointers in order of entrance
|
final List<int> _pointerQueue = <int>[]; // A queue to sort pointers in order of entrance
|
||||||
final Map<int, VelocityTracker> _velocityTrackers = <int, VelocityTracker>{};
|
final Map<int, VelocityTracker> _velocityTrackers = <int, VelocityTracker>{};
|
||||||
late Offset _delta;
|
late Offset _delta;
|
||||||
|
final Map<int, _PointerPanZoomData> _pointerPanZooms = <int, _PointerPanZoomData>{};
|
||||||
|
double _initialPanZoomScaleFactor = 1;
|
||||||
|
double _initialPanZoomRotationFactor = 0;
|
||||||
|
|
||||||
double get _scaleFactor => _initialSpan > 0.0 ? _currentSpan / _initialSpan : 1.0;
|
double get _pointerScaleFactor => _initialSpan > 0.0 ? _currentSpan / _initialSpan : 1.0;
|
||||||
|
|
||||||
double get _horizontalScaleFactor => _initialHorizontalSpan > 0.0 ? _currentHorizontalSpan / _initialHorizontalSpan : 1.0;
|
double get _pointerHorizontalScaleFactor => _initialHorizontalSpan > 0.0 ? _currentHorizontalSpan / _initialHorizontalSpan : 1.0;
|
||||||
|
|
||||||
double get _verticalScaleFactor => _initialVerticalSpan > 0.0 ? _currentVerticalSpan / _initialVerticalSpan : 1.0;
|
double get _pointerVerticalScaleFactor => _initialVerticalSpan > 0.0 ? _currentVerticalSpan / _initialVerticalSpan : 1.0;
|
||||||
|
|
||||||
|
double get _scaleFactor {
|
||||||
|
double scale = _pointerScaleFactor;
|
||||||
|
for (final _PointerPanZoomData p in _pointerPanZooms.values) {
|
||||||
|
scale *= p.scale / _initialPanZoomScaleFactor;
|
||||||
|
}
|
||||||
|
return scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
double get _horizontalScaleFactor {
|
||||||
|
double scale = _pointerHorizontalScaleFactor;
|
||||||
|
for (final _PointerPanZoomData p in _pointerPanZooms.values) {
|
||||||
|
scale *= p.scale / _initialPanZoomScaleFactor;
|
||||||
|
}
|
||||||
|
return scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
double get _verticalScaleFactor {
|
||||||
|
double scale = _pointerVerticalScaleFactor;
|
||||||
|
for (final _PointerPanZoomData p in _pointerPanZooms.values) {
|
||||||
|
scale *= p.scale / _initialPanZoomScaleFactor;
|
||||||
|
}
|
||||||
|
return scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get _pointerCount {
|
||||||
|
return _pointerPanZooms.length + _pointerQueue.length;
|
||||||
|
}
|
||||||
|
|
||||||
double _computeRotationFactor() {
|
double _computeRotationFactor() {
|
||||||
if (_initialLine == null || _currentLine == null) {
|
double factor = 0.0;
|
||||||
return 0.0;
|
if (_initialLine != null && _currentLine != null) {
|
||||||
}
|
|
||||||
final double fx = _initialLine!.pointerStartLocation.dx;
|
final double fx = _initialLine!.pointerStartLocation.dx;
|
||||||
final double fy = _initialLine!.pointerStartLocation.dy;
|
final double fy = _initialLine!.pointerStartLocation.dy;
|
||||||
final double sx = _initialLine!.pointerEndLocation.dx;
|
final double sx = _initialLine!.pointerEndLocation.dx;
|
||||||
|
@ -170,7 +206,13 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
final double angle1 = math.atan2(fy - sy, fx - sx);
|
final double angle1 = math.atan2(fy - sy, fx - sx);
|
||||||
final double angle2 = math.atan2(nfy - nsy, nfx - nsx);
|
final double angle2 = math.atan2(nfy - nsy, nfx - nsx);
|
||||||
|
|
||||||
return angle2 - angle1;
|
factor = angle2 - angle1;
|
||||||
|
}
|
||||||
|
for (final _PointerPanZoomData p in _pointerPanZooms.values) {
|
||||||
|
factor += p.rotation;
|
||||||
|
}
|
||||||
|
factor -= _initialPanZoomRotationFactor;
|
||||||
|
return factor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -185,8 +227,21 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
_currentHorizontalSpan = 0.0;
|
_currentHorizontalSpan = 0.0;
|
||||||
_initialVerticalSpan = 0.0;
|
_initialVerticalSpan = 0.0;
|
||||||
_currentVerticalSpan = 0.0;
|
_currentVerticalSpan = 0.0;
|
||||||
_pointerLocations = <int, Offset>{};
|
}
|
||||||
_pointerQueue = <int>[];
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool isPointerPanZoomAllowed(PointerPanZoomStartEvent event) => true;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void addAllowedPointerPanZoom(PointerPanZoomStartEvent event) {
|
||||||
|
super.addAllowedPointerPanZoom(event);
|
||||||
|
startTrackingPointer(event.pointer, event.transform);
|
||||||
|
_velocityTrackers[event.pointer] = VelocityTracker.withKind(event.kind);
|
||||||
|
if (_state == _ScaleState.ready) {
|
||||||
|
_state = _ScaleState.possible;
|
||||||
|
_initialPanZoomScaleFactor = 1.0;
|
||||||
|
_initialPanZoomRotationFactor = 0.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,7 +252,9 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
bool shouldStartIfAccepted = false;
|
bool shouldStartIfAccepted = false;
|
||||||
if (event is PointerMoveEvent) {
|
if (event is PointerMoveEvent) {
|
||||||
final VelocityTracker tracker = _velocityTrackers[event.pointer]!;
|
final VelocityTracker tracker = _velocityTrackers[event.pointer]!;
|
||||||
if (!event.synthesized) tracker.addPosition(event.timeStamp, event.position);
|
if (!event.synthesized) {
|
||||||
|
tracker.addPosition(event.timeStamp, event.position);
|
||||||
|
}
|
||||||
_pointerLocations[event.pointer] = event.position;
|
_pointerLocations[event.pointer] = event.position;
|
||||||
shouldStartIfAccepted = true;
|
shouldStartIfAccepted = true;
|
||||||
_lastTransform = event.transform;
|
_lastTransform = event.transform;
|
||||||
|
@ -212,24 +269,46 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
_pointerQueue.remove(event.pointer);
|
_pointerQueue.remove(event.pointer);
|
||||||
didChangeConfiguration = true;
|
didChangeConfiguration = true;
|
||||||
_lastTransform = event.transform;
|
_lastTransform = event.transform;
|
||||||
|
} else if (event is PointerPanZoomStartEvent) {
|
||||||
|
assert(_pointerPanZooms[event.pointer] == null);
|
||||||
|
_pointerPanZooms[event.pointer] = _PointerPanZoomData(focalPoint: event.position, scale: 1, rotation: 0);
|
||||||
|
didChangeConfiguration = true;
|
||||||
|
shouldStartIfAccepted = true;
|
||||||
|
} else if (event is PointerPanZoomUpdateEvent) {
|
||||||
|
assert(_pointerPanZooms[event.pointer] != null);
|
||||||
|
if (!event.synthesized) {
|
||||||
|
_velocityTrackers[event.pointer]!.addPosition(event.timeStamp, event.pan);
|
||||||
|
}
|
||||||
|
_pointerPanZooms[event.pointer] = _PointerPanZoomData(focalPoint: event.position + event.pan, scale: event.scale, rotation: event.rotation);
|
||||||
|
_lastTransform = event.transform;
|
||||||
|
shouldStartIfAccepted = true;
|
||||||
|
} else if (event is PointerPanZoomEndEvent) {
|
||||||
|
assert(_pointerPanZooms[event.pointer] != null);
|
||||||
|
_pointerPanZooms.remove(event.pointer);
|
||||||
|
didChangeConfiguration = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateLines();
|
_updateLines();
|
||||||
_update();
|
_update();
|
||||||
|
|
||||||
if (!didChangeConfiguration || _reconfigure(event.pointer)) _advanceStateMachine(shouldStartIfAccepted, event.kind);
|
if (!didChangeConfiguration || _reconfigure(event.pointer)) {
|
||||||
|
_advanceStateMachine(shouldStartIfAccepted, event.kind);
|
||||||
|
}
|
||||||
stopTrackingIfPointerNoLongerDown(event);
|
stopTrackingIfPointerNoLongerDown(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _update() {
|
void _update() {
|
||||||
final int count = _pointerLocations.keys.length;
|
|
||||||
|
|
||||||
final Offset? previousFocalPoint = _currentFocalPoint;
|
final Offset? previousFocalPoint = _currentFocalPoint;
|
||||||
|
|
||||||
// Compute the focal point
|
// Compute the focal point
|
||||||
Offset focalPoint = Offset.zero;
|
Offset focalPoint = Offset.zero;
|
||||||
for (final int pointer in _pointerLocations.keys) focalPoint += _pointerLocations[pointer]!;
|
for (final int pointer in _pointerLocations.keys) {
|
||||||
_currentFocalPoint = count > 0 ? focalPoint / count.toDouble() : Offset.zero;
|
focalPoint += _pointerLocations[pointer]!;
|
||||||
|
}
|
||||||
|
for (final _PointerPanZoomData p in _pointerPanZooms.values) {
|
||||||
|
focalPoint += p.focalPoint;
|
||||||
|
}
|
||||||
|
_currentFocalPoint = _pointerCount > 0 ? focalPoint / _pointerCount.toDouble() : Offset.zero;
|
||||||
|
|
||||||
if (previousFocalPoint == null) {
|
if (previousFocalPoint == null) {
|
||||||
_localFocalPoint = PointerEvent.transformPosition(
|
_localFocalPoint = PointerEvent.transformPosition(
|
||||||
|
@ -246,6 +325,16 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
_delta = _localFocalPoint - localPreviousFocalPoint;
|
_delta = _localFocalPoint - localPreviousFocalPoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final int count = _pointerLocations.keys.length;
|
||||||
|
|
||||||
|
Offset pointerFocalPoint = Offset.zero;
|
||||||
|
for (final int pointer in _pointerLocations.keys) {
|
||||||
|
pointerFocalPoint += _pointerLocations[pointer]!;
|
||||||
|
}
|
||||||
|
if (count > 0) {
|
||||||
|
pointerFocalPoint = pointerFocalPoint / count.toDouble();
|
||||||
|
}
|
||||||
|
|
||||||
// Span is the average deviation from focal point. Horizontal and vertical
|
// Span is the average deviation from focal point. Horizontal and vertical
|
||||||
// spans are the average deviations from the focal point's horizontal and
|
// spans are the average deviations from the focal point's horizontal and
|
||||||
// vertical coordinates, respectively.
|
// vertical coordinates, respectively.
|
||||||
|
@ -253,9 +342,9 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
double totalHorizontalDeviation = 0.0;
|
double totalHorizontalDeviation = 0.0;
|
||||||
double totalVerticalDeviation = 0.0;
|
double totalVerticalDeviation = 0.0;
|
||||||
for (final int pointer in _pointerLocations.keys) {
|
for (final int pointer in _pointerLocations.keys) {
|
||||||
totalDeviation += (_currentFocalPoint! - _pointerLocations[pointer]!).distance;
|
totalDeviation += (pointerFocalPoint - _pointerLocations[pointer]!).distance;
|
||||||
totalHorizontalDeviation += (_currentFocalPoint!.dx - _pointerLocations[pointer]!.dx).abs();
|
totalHorizontalDeviation += (pointerFocalPoint.dx - _pointerLocations[pointer]!.dx).abs();
|
||||||
totalVerticalDeviation += (_currentFocalPoint!.dy - _pointerLocations[pointer]!.dy).abs();
|
totalVerticalDeviation += (pointerFocalPoint.dy - _pointerLocations[pointer]!.dy).abs();
|
||||||
}
|
}
|
||||||
_currentSpan = count > 0 ? totalDeviation / count : 0.0;
|
_currentSpan = count > 0 ? totalDeviation / count : 0.0;
|
||||||
_currentHorizontalSpan = count > 0 ? totalHorizontalDeviation / count : 0.0;
|
_currentHorizontalSpan = count > 0 ? totalHorizontalDeviation / count : 0.0;
|
||||||
|
@ -297,6 +386,13 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
_initialLine = _currentLine;
|
_initialLine = _currentLine;
|
||||||
_initialHorizontalSpan = _currentHorizontalSpan;
|
_initialHorizontalSpan = _currentHorizontalSpan;
|
||||||
_initialVerticalSpan = _currentVerticalSpan;
|
_initialVerticalSpan = _currentVerticalSpan;
|
||||||
|
if (_pointerPanZooms.isEmpty) {
|
||||||
|
_initialPanZoomScaleFactor = 1.0;
|
||||||
|
_initialPanZoomRotationFactor = 0.0;
|
||||||
|
} else {
|
||||||
|
_initialPanZoomScaleFactor = _scaleFactor / _pointerScaleFactor;
|
||||||
|
_initialPanZoomRotationFactor = _pointerPanZooms.values.map((_PointerPanZoomData x) => x.rotation).reduce((double a, double b) => a + b);
|
||||||
|
}
|
||||||
if (_state == _ScaleState.started) {
|
if (_state == _ScaleState.started) {
|
||||||
if (onEnd != null) {
|
if (onEnd != null) {
|
||||||
final VelocityTracker tracker = _velocityTrackers[pointer]!;
|
final VelocityTracker tracker = _velocityTrackers[pointer]!;
|
||||||
|
@ -304,10 +400,12 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
Velocity velocity = tracker.getVelocity();
|
Velocity velocity = tracker.getVelocity();
|
||||||
if (_isFlingGesture(velocity)) {
|
if (_isFlingGesture(velocity)) {
|
||||||
final Offset pixelsPerSecond = velocity.pixelsPerSecond;
|
final Offset pixelsPerSecond = velocity.pixelsPerSecond;
|
||||||
if (pixelsPerSecond.distanceSquared > kMaxFlingVelocity * kMaxFlingVelocity) velocity = Velocity(pixelsPerSecond: (pixelsPerSecond / pixelsPerSecond.distance) * kMaxFlingVelocity);
|
if (pixelsPerSecond.distanceSquared > kMaxFlingVelocity * kMaxFlingVelocity) {
|
||||||
invokeCallback<void>('onEnd', () => onEnd!(ScaleEndDetails(velocity: velocity, pointerCount: _pointerQueue.length)));
|
velocity = Velocity(pixelsPerSecond: (pixelsPerSecond / pixelsPerSecond.distance) * kMaxFlingVelocity);
|
||||||
|
}
|
||||||
|
invokeCallback<void>('onEnd', () => onEnd!(ScaleEndDetails(velocity: velocity, pointerCount: _pointerCount)));
|
||||||
} else {
|
} else {
|
||||||
invokeCallback<void>('onEnd', () => onEnd!(ScaleEndDetails(pointerCount: _pointerQueue.length)));
|
invokeCallback<void>('onEnd', () => onEnd!(ScaleEndDetails(pointerCount: _pointerCount)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_state = _ScaleState.accepted;
|
_state = _ScaleState.accepted;
|
||||||
|
@ -317,7 +415,9 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _advanceStateMachine(bool shouldStartIfAccepted, PointerDeviceKind pointerDeviceKind) {
|
void _advanceStateMachine(bool shouldStartIfAccepted, PointerDeviceKind pointerDeviceKind) {
|
||||||
if (_state == _ScaleState.ready) _state = _ScaleState.possible;
|
if (_state == _ScaleState.ready) {
|
||||||
|
_state = _ScaleState.possible;
|
||||||
|
}
|
||||||
|
|
||||||
// TLAD insert start
|
// TLAD insert start
|
||||||
if (_pointerQueue.length == 2) {
|
if (_pointerQueue.length == 2) {
|
||||||
|
@ -328,7 +428,9 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
if (_state == _ScaleState.possible) {
|
if (_state == _ScaleState.possible) {
|
||||||
final double spanDelta = (_currentSpan - _initialSpan).abs();
|
final double spanDelta = (_currentSpan - _initialSpan).abs();
|
||||||
final double focalPointDelta = (_currentFocalPoint! - _initialFocalPoint).distance;
|
final double focalPointDelta = (_currentFocalPoint! - _initialFocalPoint).distance;
|
||||||
if (spanDelta > computeScaleSlop(pointerDeviceKind) || focalPointDelta > computePanSlop(pointerDeviceKind, gestureSettings)) resolve(GestureDisposition.accepted);
|
if (spanDelta > computeScaleSlop(pointerDeviceKind) || focalPointDelta > computePanSlop(pointerDeviceKind, gestureSettings) || math.max(_scaleFactor / _pointerScaleFactor, _pointerScaleFactor / _scaleFactor) > 1.05) {
|
||||||
|
resolve(GestureDisposition.accepted);
|
||||||
|
}
|
||||||
} else if (_state.index >= _ScaleState.accepted.index) {
|
} else if (_state.index >= _ScaleState.accepted.index) {
|
||||||
resolve(GestureDisposition.accepted);
|
resolve(GestureDisposition.accepted);
|
||||||
}
|
}
|
||||||
|
@ -338,7 +440,7 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
_dispatchOnStartCallbackIfNeeded();
|
_dispatchOnStartCallbackIfNeeded();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_state == _ScaleState.started && onUpdate != null)
|
if (_state == _ScaleState.started && onUpdate != null) {
|
||||||
invokeCallback<void>('onUpdate', () {
|
invokeCallback<void>('onUpdate', () {
|
||||||
onUpdate!(ScaleUpdateDetails(
|
onUpdate!(ScaleUpdateDetails(
|
||||||
scale: _scaleFactor,
|
scale: _scaleFactor,
|
||||||
|
@ -347,23 +449,25 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
focalPoint: _currentFocalPoint!,
|
focalPoint: _currentFocalPoint!,
|
||||||
localFocalPoint: _localFocalPoint,
|
localFocalPoint: _localFocalPoint,
|
||||||
rotation: _computeRotationFactor(),
|
rotation: _computeRotationFactor(),
|
||||||
pointerCount: _pointerQueue.length,
|
pointerCount: _pointerCount,
|
||||||
focalPointDelta: _delta,
|
focalPointDelta: _delta,
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _dispatchOnStartCallbackIfNeeded() {
|
void _dispatchOnStartCallbackIfNeeded() {
|
||||||
assert(_state == _ScaleState.started);
|
assert(_state == _ScaleState.started);
|
||||||
if (onStart != null)
|
if (onStart != null) {
|
||||||
invokeCallback<void>('onStart', () {
|
invokeCallback<void>('onStart', () {
|
||||||
onStart!(ScaleStartDetails(
|
onStart!(ScaleStartDetails(
|
||||||
focalPoint: _currentFocalPoint!,
|
focalPoint: _currentFocalPoint!,
|
||||||
localFocalPoint: _localFocalPoint,
|
localFocalPoint: _localFocalPoint,
|
||||||
pointerCount: _pointerQueue.length,
|
pointerCount: _pointerCount,
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void acceptGesture(int pointer) {
|
void acceptGesture(int pointer) {
|
||||||
|
@ -376,12 +480,22 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
|
||||||
_initialLine = _currentLine;
|
_initialLine = _currentLine;
|
||||||
_initialHorizontalSpan = _currentHorizontalSpan;
|
_initialHorizontalSpan = _currentHorizontalSpan;
|
||||||
_initialVerticalSpan = _currentVerticalSpan;
|
_initialVerticalSpan = _currentVerticalSpan;
|
||||||
|
if (_pointerPanZooms.isEmpty) {
|
||||||
|
_initialPanZoomScaleFactor = 1.0;
|
||||||
|
_initialPanZoomRotationFactor = 0.0;
|
||||||
|
} else {
|
||||||
|
_initialPanZoomScaleFactor = _scaleFactor / _pointerScaleFactor;
|
||||||
|
_initialPanZoomRotationFactor = _pointerPanZooms.values.map((_PointerPanZoomData x) => x.rotation).reduce((double a, double b) => a + b);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void rejectGesture(int pointer) {
|
void rejectGesture(int pointer) {
|
||||||
|
_pointerPanZooms.remove(pointer);
|
||||||
|
_pointerLocations.remove(pointer);
|
||||||
|
_pointerQueue.remove(pointer);
|
||||||
stopTrackingPointer(pointer);
|
stopTrackingPointer(pointer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,8 @@ import 'dart:ui' as ui;
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
// adapted from Flutter `RawImage`, `paintImage()` from `DecorationImagePainter`, etc.
|
// adapted from Flutter `_ImageState` in `/widgets/image.dart`
|
||||||
|
// and `DecorationImagePainter` in `/painting/decoration_image.dart`
|
||||||
// to transition between 2 different fits during hero animation:
|
// to transition between 2 different fits during hero animation:
|
||||||
// - BoxFit.cover at t=0
|
// - BoxFit.cover at t=0
|
||||||
// - BoxFit.contain at t=1
|
// - BoxFit.contain at t=1
|
||||||
|
@ -34,11 +35,6 @@ class _TransitionImageState extends State<TransitionImage> {
|
||||||
bool _isListeningToStream = false;
|
bool _isListeningToStream = false;
|
||||||
int? _frameNumber;
|
int? _frameNumber;
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
assert(_imageStream != null);
|
assert(_imageStream != null);
|
||||||
|
@ -63,8 +59,9 @@ class _TransitionImageState extends State<TransitionImage> {
|
||||||
void didUpdateWidget(covariant TransitionImage oldWidget) {
|
void didUpdateWidget(covariant TransitionImage oldWidget) {
|
||||||
super.didUpdateWidget(oldWidget);
|
super.didUpdateWidget(oldWidget);
|
||||||
if (_isListeningToStream) {
|
if (_isListeningToStream) {
|
||||||
_imageStream!.removeListener(_getListener());
|
final ImageStreamListener oldListener = _getListener();
|
||||||
_imageStream!.addListener(_getListener());
|
_imageStream!.addListener(_getListener(recreateListener: true));
|
||||||
|
_imageStream!.removeListener(oldListener);
|
||||||
}
|
}
|
||||||
if (widget.image != oldWidget.image) _resolveImage();
|
if (widget.image != oldWidget.image) _resolveImage();
|
||||||
}
|
}
|
||||||
|
@ -84,31 +81,41 @@ class _TransitionImageState extends State<TransitionImage> {
|
||||||
_updateSourceStream(newStream);
|
_updateSourceStream(newStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImageStreamListener _getListener() {
|
ImageStreamListener? _imageStreamListener;
|
||||||
return ImageStreamListener(
|
|
||||||
|
ImageStreamListener _getListener({bool recreateListener = false}) {
|
||||||
|
if (_imageStreamListener == null || recreateListener) {
|
||||||
|
_imageStreamListener = ImageStreamListener(
|
||||||
_handleImageFrame,
|
_handleImageFrame,
|
||||||
onChunk: null,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
return _imageStreamListener!;
|
||||||
|
}
|
||||||
|
|
||||||
void _handleImageFrame(ImageInfo imageInfo, bool synchronousCall) {
|
void _handleImageFrame(ImageInfo imageInfo, bool synchronousCall) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_imageInfo = imageInfo;
|
_replaceImage(info: imageInfo);
|
||||||
_frameNumber = _frameNumber == null ? 0 : _frameNumber! + 1;
|
_frameNumber = _frameNumber == null ? 0 : _frameNumber! + 1;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Updates _imageStream to newStream, and moves the stream listener
|
void _replaceImage({required ImageInfo? info}) {
|
||||||
// registration from the old stream to the new stream (if a listener was
|
_imageInfo?.dispose();
|
||||||
// registered).
|
_imageInfo = info;
|
||||||
void _updateSourceStream(ImageStream newStream) {
|
}
|
||||||
if (_imageStream?.key == newStream.key) return;
|
|
||||||
|
|
||||||
if (_isListeningToStream) _imageStream!.removeListener(_getListener());
|
void _updateSourceStream(ImageStream newStream) {
|
||||||
|
if (_imageStream?.key == newStream.key) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_isListeningToStream) {
|
||||||
|
_imageStream!.removeListener(_getListener());
|
||||||
|
}
|
||||||
|
|
||||||
if (!widget.gaplessPlayback) {
|
if (!widget.gaplessPlayback) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_imageInfo = null;
|
_replaceImage(info: null);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,17 +124,26 @@ class _TransitionImageState extends State<TransitionImage> {
|
||||||
});
|
});
|
||||||
|
|
||||||
_imageStream = newStream;
|
_imageStream = newStream;
|
||||||
if (_isListeningToStream) _imageStream!.addListener(_getListener());
|
if (_isListeningToStream) {
|
||||||
|
_imageStream!.addListener(_getListener());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _listenToStream() {
|
void _listenToStream() {
|
||||||
if (_isListeningToStream) return;
|
if (_isListeningToStream) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_imageStream!.addListener(_getListener());
|
_imageStream!.addListener(_getListener());
|
||||||
|
|
||||||
_isListeningToStream = true;
|
_isListeningToStream = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _stopListeningToStream() {
|
void _stopListeningToStream() {
|
||||||
if (!_isListeningToStream) return;
|
if (!_isListeningToStream) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_imageStream!.removeListener(_getListener());
|
_imageStream!.removeListener(_getListener());
|
||||||
_isListeningToStream = false;
|
_isListeningToStream = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ import 'package:provider/provider.dart';
|
||||||
|
|
||||||
// Use a `SliverList` instead of multiple `SliverGrid` because having one `SliverGrid` per section does not scale up.
|
// Use a `SliverList` instead of multiple `SliverGrid` because having one `SliverGrid` per section does not scale up.
|
||||||
// With the multiple `SliverGrid` solution, thumbnails at the beginning of each sections are built even though they are offscreen
|
// With the multiple `SliverGrid` solution, thumbnails at the beginning of each sections are built even though they are offscreen
|
||||||
// because of `RenderSliverMultiBoxAdaptor.addInitialChild` called by `RenderSliverGrid.performLayout` (line 547), as of Flutter v1.17.0.
|
// because of `RenderSliverMultiBoxAdaptor.addInitialChild` called by `RenderSliverGrid.performLayout` (line 591), as of Flutter v3.3.3.
|
||||||
// cf https://github.com/flutter/flutter/issues/49027
|
// cf https://github.com/flutter/flutter/issues/49027
|
||||||
// adapted from Flutter `RenderSliverFixedExtentBoxAdaptor` in `/rendering/sliver_fixed_extent_list.dart`
|
// adapted from Flutter `RenderSliverFixedExtentBoxAdaptor` in `/rendering/sliver_fixed_extent_list.dart`
|
||||||
class SectionedListSliver<T> extends StatelessWidget {
|
class SectionedListSliver<T> extends StatelessWidget {
|
||||||
|
|
|
@ -18,7 +18,7 @@ abstract class AvesSearchDelegate extends SearchDelegate {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget buildLeading(BuildContext context) {
|
Widget? buildLeading(BuildContext context) {
|
||||||
// use a property instead of checking `Navigator.canPop(context)`
|
// use a property instead of checking `Navigator.canPop(context)`
|
||||||
// because the navigator state changes as soon as we press back
|
// because the navigator state changes as soon as we press back
|
||||||
// so the leading may mistakenly switch to the close button
|
// so the leading may mistakenly switch to the close button
|
||||||
|
@ -37,7 +37,7 @@ abstract class AvesSearchDelegate extends SearchDelegate {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Widget> buildActions(BuildContext context) {
|
List<Widget>? buildActions(BuildContext context) {
|
||||||
return [
|
return [
|
||||||
if (query.isNotEmpty)
|
if (query.isNotEmpty)
|
||||||
IconButton(
|
IconButton(
|
||||||
|
@ -91,6 +91,9 @@ abstract class AvesSearchDelegate extends SearchDelegate {
|
||||||
@override
|
@override
|
||||||
set query(String value) {
|
set query(String value) {
|
||||||
queryTextController.text = value;
|
queryTextController.text = value;
|
||||||
|
if (queryTextController.text.isNotEmpty) {
|
||||||
|
queryTextController.selection = TextSelection.fromPosition(TextPosition(offset: queryTextController.text.length));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final ValueNotifier<SearchBody?> currentBodyNotifier = ValueNotifier(null);
|
final ValueNotifier<SearchBody?> currentBodyNotifier = ValueNotifier(null);
|
||||||
|
|
|
@ -138,7 +138,7 @@ class _SearchPageState extends State<SearchPage> {
|
||||||
hintStyle: theme.inputDecorationTheme.hintStyle,
|
hintStyle: theme.inputDecorationTheme.hintStyle,
|
||||||
),
|
),
|
||||||
textInputAction: TextInputAction.search,
|
textInputAction: TextInputAction.search,
|
||||||
style: theme.textTheme.headline6,
|
style: theme.textTheme.titleLarge,
|
||||||
onSubmitted: (_) => widget.delegate.showResults(context),
|
onSubmitted: (_) => widget.delegate.showResults(context),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -14,7 +14,7 @@ class SearchPageRoute<T> extends PageRoute<T> {
|
||||||
delegate.route == null,
|
delegate.route == null,
|
||||||
'The ${delegate.runtimeType} instance is currently used by another active '
|
'The ${delegate.runtimeType} instance is currently used by another active '
|
||||||
'search. Please close that search by calling close() on the SearchDelegate '
|
'search. Please close that search by calling close() on the SearchDelegate '
|
||||||
'before openening another search with the same delegate instance.',
|
'before opening another search with the same delegate instance.',
|
||||||
);
|
);
|
||||||
delegate.route = this;
|
delegate.route = this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,7 +157,7 @@ class _FilePickerState extends State<FilePicker> {
|
||||||
padding: const EdgeInsets.all(16),
|
padding: const EdgeInsets.all(16),
|
||||||
child: Text(
|
child: Text(
|
||||||
context.l10n.filePickerOpenFrom,
|
context.l10n.filePickerOpenFrom,
|
||||||
style: Theme.of(context).textTheme.headline5,
|
style: Theme.of(context).textTheme.headlineSmall,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
...volumes.map((v) {
|
...volumes.map((v) {
|
||||||
|
|
|
@ -24,7 +24,7 @@ class InfoSearchDelegate extends SearchDelegate {
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget buildLeading(BuildContext context) {
|
Widget? buildLeading(BuildContext context) {
|
||||||
return IconButton(
|
return IconButton(
|
||||||
icon: AnimatedIcon(
|
icon: AnimatedIcon(
|
||||||
icon: AnimatedIcons.menu_arrow,
|
icon: AnimatedIcons.menu_arrow,
|
||||||
|
@ -36,7 +36,7 @@ class InfoSearchDelegate extends SearchDelegate {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Widget> buildActions(BuildContext context) {
|
List<Widget>? buildActions(BuildContext context) {
|
||||||
return [
|
return [
|
||||||
if (query.isNotEmpty)
|
if (query.isNotEmpty)
|
||||||
IconButton(
|
IconButton(
|
||||||
|
|
|
@ -116,7 +116,7 @@ class _WelcomePageState extends State<WelcomePage> {
|
||||||
List<Widget> _buildHeader(BuildContext context, {required bool isPortrait}) {
|
List<Widget> _buildHeader(BuildContext context, {required bool isPortrait}) {
|
||||||
final message = Text(
|
final message = Text(
|
||||||
context.l10n.welcomeMessage,
|
context.l10n.welcomeMessage,
|
||||||
style: Theme.of(context).textTheme.headline5,
|
style: Theme.of(context).textTheme.headlineSmall,
|
||||||
);
|
);
|
||||||
final padding = isPortrait ? 16.0 : 8.0;
|
final padding = isPortrait ? 16.0 : 8.0;
|
||||||
return [
|
return [
|
||||||
|
|
45
pubspec.lock
45
pubspec.lock
|
@ -154,7 +154,7 @@ packages:
|
||||||
name: connectivity_plus_web
|
name: connectivity_plus_web
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.3"
|
version: "1.2.4"
|
||||||
connectivity_plus_windows:
|
connectivity_plus_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -319,7 +319,7 @@ packages:
|
||||||
name: firebase_core
|
name: firebase_core
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.22.0"
|
version: "1.23.0"
|
||||||
firebase_core_platform_interface:
|
firebase_core_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -340,14 +340,14 @@ packages:
|
||||||
name: firebase_crashlytics
|
name: firebase_crashlytics
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.8.10"
|
version: "2.8.11"
|
||||||
firebase_crashlytics_platform_interface:
|
firebase_crashlytics_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: firebase_crashlytics_platform_interface
|
name: firebase_crashlytics_platform_interface
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.2.16"
|
version: "3.2.17"
|
||||||
flex_color_picker:
|
flex_color_picker:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -489,28 +489,28 @@ packages:
|
||||||
name: google_maps_flutter
|
name: google_maps_flutter
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.0"
|
version: "2.2.1"
|
||||||
google_maps_flutter_android:
|
google_maps_flutter_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: google_maps_flutter_android
|
name: google_maps_flutter_android
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.0"
|
version: "2.3.1"
|
||||||
google_maps_flutter_ios:
|
google_maps_flutter_ios:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: google_maps_flutter_ios
|
name: google_maps_flutter_ios
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.11"
|
version: "2.1.12"
|
||||||
google_maps_flutter_platform_interface:
|
google_maps_flutter_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: google_maps_flutter_platform_interface
|
name: google_maps_flutter_platform_interface
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.2"
|
version: "2.2.4"
|
||||||
highlight:
|
highlight:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -601,7 +601,7 @@ packages:
|
||||||
name: markdown
|
name: markdown
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.0.0"
|
version: "6.0.1"
|
||||||
matcher:
|
matcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -771,7 +771,7 @@ packages:
|
||||||
name: path_provider_platform_interface
|
name: path_provider_platform_interface
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.4"
|
version: "2.0.5"
|
||||||
path_provider_windows:
|
path_provider_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -799,7 +799,7 @@ packages:
|
||||||
name: permission_handler
|
name: permission_handler
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.0.0"
|
version: "10.0.2"
|
||||||
permission_handler_android:
|
permission_handler_android:
|
||||||
dependency: "direct overridden"
|
dependency: "direct overridden"
|
||||||
description:
|
description:
|
||||||
|
@ -822,7 +822,7 @@ packages:
|
||||||
name: permission_handler_platform_interface
|
name: permission_handler_platform_interface
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.7.0"
|
version: "3.8.0"
|
||||||
permission_handler_windows:
|
permission_handler_windows:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -850,7 +850,7 @@ packages:
|
||||||
name: plugin_platform_interface
|
name: plugin_platform_interface
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.3"
|
||||||
polylabel:
|
polylabel:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -927,7 +927,7 @@ packages:
|
||||||
name: screen_brightness
|
name: screen_brightness
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.2.1"
|
version: "0.2.2"
|
||||||
screen_brightness_android:
|
screen_brightness_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -956,6 +956,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.0"
|
version: "0.1.0"
|
||||||
|
screen_brightness_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: screen_brightness_windows
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "0.1.0"
|
||||||
shared_preferences:
|
shared_preferences:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -1018,7 +1025,7 @@ packages:
|
||||||
name: shelf
|
name: shelf
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.2"
|
version: "1.4.0"
|
||||||
shelf_packages_handler:
|
shelf_packages_handler:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1079,14 +1086,14 @@ packages:
|
||||||
name: sqflite
|
name: sqflite
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.3+1"
|
version: "2.1.0"
|
||||||
sqflite_common:
|
sqflite_common:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: sqflite_common
|
name: sqflite_common
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.1+1"
|
version: "2.3.0"
|
||||||
stack_trace:
|
stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1200,7 +1207,7 @@ packages:
|
||||||
name: url_launcher
|
name: url_launcher
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.1.5"
|
version: "6.1.6"
|
||||||
url_launcher_android:
|
url_launcher_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1235,7 +1242,7 @@ packages:
|
||||||
name: url_launcher_platform_interface
|
name: url_launcher_platform_interface
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.0"
|
version: "2.1.1"
|
||||||
url_launcher_web:
|
url_launcher_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
15
pubspec.yaml
15
pubspec.yaml
|
@ -154,22 +154,23 @@ flutter:
|
||||||
# adapts from package `flutter_highlight` v0.7.0
|
# adapts from package `flutter_highlight` v0.7.0
|
||||||
#
|
#
|
||||||
# `OutputBuffer` in `/services/common/output_buffer.dart`
|
# `OutputBuffer` in `/services/common/output_buffer.dart`
|
||||||
# adapts from Flutter `_OutputBuffer` in `/foundation/consolidate_response.dart`
|
# adapts from Flutter v3.3.3 `_OutputBuffer` in `/foundation/consolidate_response.dart`
|
||||||
#
|
#
|
||||||
# `OverlaySnackBar` in `/widgets/common/action_mixins/overlay_snack_bar.dart`
|
# `OverlaySnackBar` in `/widgets/common/action_mixins/overlay_snack_bar.dart`
|
||||||
# adapts from Flutter `SnackBar` in `/material/snack_bar.dart`
|
# adapts from Flutter v3.3.3 `SnackBar` in `/material/snack_bar.dart`
|
||||||
#
|
#
|
||||||
# `EagerScaleGestureRecognizer` in `/widgets/common/behaviour/eager_scale_gesture_recognizer.dart`
|
# `EagerScaleGestureRecognizer` in `/widgets/common/behaviour/eager_scale_gesture_recognizer.dart`
|
||||||
# adapts from Flutter `ScaleGestureRecognizer` in `/gestures/scale.dart`
|
# adapts from Flutter v3.3.3 `ScaleGestureRecognizer` in `/gestures/scale.dart`
|
||||||
#
|
#
|
||||||
# `KnownExtentScrollPhysics` in `/widgets/common/behaviour/known_extent_scroll_physics.dart`
|
# `KnownExtentScrollPhysics` in `/widgets/common/behaviour/known_extent_scroll_physics.dart`
|
||||||
# adapts from Flutter `FixedExtentScrollPhysics` in `/widgets/list_wheel_scroll_view.dart`
|
# adapts from Flutter v3.3.3 `FixedExtentScrollPhysics` in `/widgets/list_wheel_scroll_view.dart`
|
||||||
#
|
#
|
||||||
# `TransitionImage` in `/widgets/common/fx/transition_image.dart`
|
# `TransitionImage` in `/widgets/common/fx/transition_image.dart`
|
||||||
# adapts from Flutter `RawImage` in `/widgets/basic.dart` and `DecorationImagePainter` in `/painting/decoration_image.dart`
|
# adapts from Flutter v3.3.3 `_ImageState` in `/widgets/image.dart`
|
||||||
|
# and `DecorationImagePainter` in `/painting/decoration_image.dart`
|
||||||
#
|
#
|
||||||
# `_RenderSliverKnownExtentBoxAdaptor` in `/widgets/common/grid/sliver.dart`
|
# `_RenderSliverKnownExtentBoxAdaptor` in `/widgets/common/grid/sliver.dart`
|
||||||
# adapts from Flutter `RenderSliverFixedExtentBoxAdaptor` in `/rendering/sliver_fixed_extent_list.dart`
|
# adapts from Flutter v3.3.3 `RenderSliverFixedExtentBoxAdaptor` in `/rendering/sliver_fixed_extent_list.dart`
|
||||||
#
|
#
|
||||||
# `CollectionSearchDelegate`, `SearchPageRoute` in `/widgets/search/search_delegate.dart`
|
# `CollectionSearchDelegate`, `SearchPageRoute` in `/widgets/search/search_delegate.dart`
|
||||||
# adapts from Flutter `SearchDelegate`, `_SearchPageRoute` in `/material/search.dart`
|
# adapts from Flutter v3.3.3 `SearchDelegate`, `_SearchPageRoute` in `/material/search.dart`
|
||||||
|
|
File diff suppressed because one or more lines are too long
1
shaders_3.3.3.sksl.json
Normal file
1
shaders_3.3.3.sksl.json
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue