#flutter #dart
#flutter #dart
Вопрос:
У меня есть экран, который представляет собой фотоальбом с несколькими фотографиями. Пользователь может щелкнуть любую фотографию, чтобы просмотреть ее в полноэкранном режиме, а после выбрать опцию ее удаления. Но когда я удаляю фотографию на последней позиции из массива, я получаю следующую ошибку:
The following RangeError was thrown building PhotoFullscreenPage(dirty, dependencies: [MediaQuery], state: _PhotoFullscreenPageState#4ce05):
RangeError (index): Invalid value: Only valid value is 0: 1
The relevant error-causing widget was:
PhotoFullscreenPage file:/.../lib/views/photos/photosAlbumPage.dart:78:33
Если я удалю все фотографии из массива, то я получу эту ошибку:
The following RangeError was thrown building PhotoFullscreenPage(dirty, dependencies: [MediaQuery], state: _PhotoFullscreenPageState#48547):
RangeError (index): Invalid value: Valid value range is empty: 0
The relevant error-causing widget was:
PhotoFullscreenPage file:/.../lib/views/photos/photosAlbumPage.dart:78:33
Вот мой код для обоих классов:
Фотоальбом Bumpage.dart
import 'package:flutter/material.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:my_app/models/photoField.dart';
import 'package:my_app/views/photos/photoFullscreenPage.dart';
class PhotosAlbumPage extends StatefulWidget {
final PhotoField photoField;
PhotosAlbumPage({Key key, this.photoField}) : super(key: key);
@override
_PhotosAlbumPageState createState() => _PhotosAlbumPageState();
}
class _PhotosAlbumPageState extends State<PhotosAlbumPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: _appBar(),
body: _body(),
);
}
Widget _appBar() {
return AppBar(
title: Text('${widget.photoField.titleDescription} - Photos Album'),
centerTitle: true,
leading: _backButton(),
);
}
Widget _backButton() {
return IconButton(
icon: Icon(Icons.arrow_back, color: Colors.white),
onPressed: () {
_sendDataBackToPhotosPage(context);
},
);
}
Widget _body() {
return CustomScrollView(slivers: <Widget>[
SliverStaggeredGrid.countBuilder(
crossAxisCount: 2,
mainAxisSpacing: 10,
crossAxisSpacing: 10,
staggeredTileBuilder: (int index) => StaggeredTile.fit(1),
itemCount: widget.photoField.photoAlbum.length,
itemBuilder: (context, index) {
return Container(
margin: EdgeInsets.all(10),
child: GestureDetector(
child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(20)),
child:
Image.asset(widget.photoField.photoAlbum[index].photoPath),
),
onTap: () async {
print('Click on photo: $index');
_awaitReturnValueFromPhotoFullscreenPage(
context: context,
photoField: widget.photoField,
photoIndex: index);
},
),
);
},
),
]);
}
void _awaitReturnValueFromPhotoFullscreenPage(
{BuildContext context, PhotoField photoField, int photoIndex}) async {
final result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PhotoFullscreenPage(
photoField: photoField, photoIndex: photoIndex), // here the error is thrown
));
setState(() {
widget.photoField.photoAlbum = resu<
if (widget.photoField.photoAlbum.isEmpty) {
Navigator.of(context).pop();
}
});
}
void _sendDataBackToPhotosPage(BuildContext context) {
PhotoField photoField = widget.photoField;
Navigator.pop(context, photoField);
}
}
PhotoFullscreenPage.dart
import 'package:flutter/material.dart';
import 'package:my_app/models/photo.dart';
import 'package:my_app/models/photoField.dart';
class PhotoFullscreenPage extends StatefulWidget {
final PhotoField photoField;
final int photoIndex;
const PhotoFullscreenPage({Key key, this.photoField, this.photoIndex})
: super(key: key);
@override
_PhotoFullscreenPageState createState() => _PhotoFullscreenPageState();
}
class _PhotoFullscreenPageState extends State<PhotoFullscreenPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: _appBar(),
body: _body(),
);
}
Widget _appBar() {
return AppBar(
title: Text(
'${widget.photoField.titleDescription} - Photo ${widget.photoIndex}'),
centerTitle: true,
leading: _backButton(),
);
}
Widget _backButton() {
return IconButton(
icon: Icon(Icons.arrow_back, color: Colors.white),
onPressed: () {
_sendDataBackToPhotosAlbumPage(context);
},
);
}
Widget _body() {
return Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Image.asset(
'${widget.photoField.photoAlbum[widget.photoIndex].photoPath}'),
IconButton(
icon: Image.asset('assets/images/delete_icon.png'),
iconSize: 70,
onPressed: () {
print("Photo will be deleted...");
setState(() {
widget.photoField.photoAlbum.removeAt(widget.photoIndex);
});
_sendDataBackToPhotosAlbumPage(context);
},
),
],
),
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
);
}
void _sendDataBackToPhotosAlbumPage(BuildContext context) {
List<Photo> photoAlbum = widget.photoField.photoAlbum;
Navigator.pop(context, photoAlbum);
}
}
Пожалуйста, помогите мне определить ошибку. Спасибо.
Ответ №1:
Вы должны проверить границы widget.photoField.photoAlbum
перед доступом к нему:
return Scaffold(
appBar: _appBar(),
body: widget.photoField.photoAlbum.length <= widget.photoIndex ? SizedBox() : _body(),
);
Визуализируйте свое пустое состояние вместо образца SizedBox()
Комментарии:
1. Большое вам спасибо, Рид! Обе ошибки исчезли.