Closed
Description
Version
3.6.4
Platforms
Android
Device Model
HUAWEI MATE 60 PRO
flutter info
[√] Flutter (Channel stable, 3.7.12, on Microsoft Windows [版本 10.0.26100.3476], locale zh-CN)
[X] Windows Version (Unable to confirm if installed Windows version is 10 or greater)
[!] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
X Android license status unknown.
Run `flutter doctor --android-licenses` to accept the SDK licenses.
See https://flutter.dev/docs/get-started/install/windows#android-setup for more details.
[√] Chrome - develop for the web
[√] Visual Studio - develop for Windows (Visual Studio Community 2022 17.12.5)
[√] Android Studio (version 2023.1)
[!] Android Studio (version 2024.1)
X Unable to find bundled Java version.
[√] IntelliJ IDEA Ultimate Edition (version 2023.1)
[√] VS Code (version 1.85.2)
[√] Connected device (4 available)
[√] HTTP Host Availability
How to reproduce?
final PMFilter filter = FilterOptionGroup( imageOption: const FilterOption( sizeConstraint: SizeConstraint(ignoreSize: false,maxWidth: 1000,maxHeight: 1000), ), videoOption: const FilterOption( sizeConstraint: SizeConstraint(ignoreSize: false,maxWidth: 8000,maxHeight: 8000,), durationConstraint: DurationConstraint(max: Duration(seconds: 7)) ) );
Logs
Example code (optional)
class _SimpleExamplePageState extends State<_SimpleExamplePage> {
final int _sizePerPage = 50;
AssetPathEntity? _path;
List<AssetEntity>? _entities;
int _totalEntitiesCount = 0;
int _page = 0;
bool _isLoading = false;
bool _isLoadingMore = false;
bool _hasMoreToLoad = true;
Future<void> _requestAssets() async {
setState(() {
_isLoading = true;
});
// Request permissions.
final PermissionState ps = await PhotoManager.requestPermissionExtend();
if (!mounted) {
return;
}
// Further requests can be only proceed with authorized or limited.
if (!ps.hasAccess) {
setState(() {
_isLoading = false;
});
showToast('Permission is not accessible.');
return;
}
// Customize your own filter options.
final PMFilter filter = FilterOptionGroup(
imageOption: const FilterOption(
sizeConstraint: SizeConstraint(ignoreSize: false,maxWidth: 1000,maxHeight: 1000),
),
videoOption: const FilterOption(
sizeConstraint: SizeConstraint(ignoreSize: false,maxWidth: 8000,maxHeight: 8000,),
durationConstraint: DurationConstraint(max: Duration(seconds: 7))
)
);
// Obtain assets using the path entity.
final List<AssetPathEntity> paths = await PhotoManager.getAssetPathList(
onlyAll: true,
filterOption: filter,
);
if (!mounted) {
return;
}
// Return if not paths found.
if (paths.isEmpty) {
setState(() {
_isLoading = false;
});
showToast('No paths found.');
return;
}
setState(() {
_path = paths.first;
});
_totalEntitiesCount = await _path!.assetCountAsync;
final List<AssetEntity> entities = await _path!.getAssetListPaged(
page: 0,
size: _sizePerPage,
);
if (!mounted) {
return;
}
setState(() {
_entities = entities;
_isLoading = false;
_hasMoreToLoad = _entities!.length < _totalEntitiesCount;
});
}
Future<void> _loadMoreAsset() async {
final List<AssetEntity> entities = await _path!.getAssetListPaged(
page: _page + 1,
size: _sizePerPage,
);
if (!mounted) {
return;
}
setState(() {
_entities!.addAll(entities);
_page++;
_hasMoreToLoad = _entities!.length < _totalEntitiesCount;
_isLoadingMore = false;
});
}
Widget _buildBody(BuildContext context) {
if (_isLoading) {
return const Center(child: CircularProgressIndicator.adaptive());
}
if (_path == null) {
return const Center(child: Text('Request paths first.'));
}
if (_entities?.isNotEmpty != true) {
return const Center(child: Text('No assets found on this device.'));
}
return GridView.custom(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4,
),
childrenDelegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
if (index == _entities!.length - 8 &&
!_isLoadingMore &&
_hasMoreToLoad) {
_loadMoreAsset();
}
final AssetEntity entity = _entities![index];
return ImageItemWidget(
key: ValueKey<int>(index),
entity: entity,
option: const ThumbnailOption(size: ThumbnailSize.square(200)),
);
},
childCount: _entities!.length,
findChildIndexCallback: (Key key) {
// Re-use elements.
if (key is ValueKey<int>) {
return key.value;
}
return null;
},
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('photo_manager')),
body: Column(
children: <Widget>[
const Padding(
padding: EdgeInsets.all(8.0),
child: Text(
'This page will only obtain the first page of assets '
'under the primary album (a.k.a. Recent). '
'If you want more filtering assets, '
'head over to "Advanced usages".',
),
),
Expanded(child: _buildBody(context)),
],
),
persistentFooterButtons: <TextButton>[
TextButton(
onPressed: () {
Navigator.of(context).push<void>(
MaterialPageRoute<void>(builder: (_) => const IndexPage()),
);
},
child: const Text('Advanced usages'),
),
],
floatingActionButton: FloatingActionButton(
onPressed: _requestAssets,
child: const Icon(Icons.developer_board),
),
);
}
}
Contact
No response