Я использую MultiProvider, который упаковывает все мое приложение. Я уже использую другой Store / Observer для аутентификации / входа в систему, и эта часть работает как надо. Я просто добавил еще один магазин, в котором отражены фотографии, сделанные пользователем, и которые затем отображаются в двух разных местах перед загрузкой.
«Снимать фото» и «вставлять их в магазин» работает нормально. Часть, которая затем должна реактивно отображать фотографии ... не так много.
Соответствующий код:
import 'dart:io';
import 'package:mobx/mobx.dart';
import 'package:image_picker/image_picker.dart';
part 'photoview_store.g.dart';
class PhotoviewStore = _PhotoviewStore with _$PhotoviewStore;
abstract class _PhotoviewStore with Store {
@observable
List<File> images = [];
@computed
int get length => images.length;
@action
Future getImage({bool fromGallery: true}) async {
ImageSource source = fromGallery ? ImageSource.gallery : ImageSource.camera;
File _image;
try {
_image = await ImagePicker.pickImage(source: source);
if(images.length >= 3) images.removeLast();
images.insert(0, _image);
print('New length: ${images.length}');
} catch(_) {
print('Error getting image');
}
}
@action
void removePicture(int index) {
images.removeAt(index);
}
}
@computed
Я добавил, потому что думал, что это может быть проблематично c для доступа images.length
в Обозревателе. Но ничего не делает.
class NeuesAnliegen extends StatefulWidget {
@override
_NeuesAnliegenState createState() => _NeuesAnliegenState();
}
class _NeuesAnliegenState extends State<NeuesAnliegen> with AutomaticKeepAliveClientMixin{
[...]
@override
Widget build(BuildContext context) {
final photoStore = Provider.of<PhotoviewStore>(context);
super.build(context);
[...]
Row(
children: <Widget>[
Expanded(
flex: 1,
child: Observer(builder: (_) {
print(photoStore.length);
if(photoStore.length < 1) return Container();
return GestureDetector(
child: Image.file(photoStore.images[0], height: 100),
onTap: () { },
);
},)
),
Expanded(
flex: 1,
child: Observer(builder: (_) {
if(photoStore.length < 2) return Container();
return GestureDetector(
child: Image.file(photoStore.images[1], height: 100),
onTap: () { },
);
},)
),
Expanded(
flex: 1,
child: Observer(builder: (_) {
if(photoStore.length < 3) return Container();
return GestureDetector(
child: Image.file(photoStore.images[2], height: 100),
onTap: () { },
);
},) )
],
),
[...]
Expanded(
child: RaisedButton.icon(
onPressed: () => photoStore.getImage(fromGallery: false,),
icon: Icon(Icons.camera),
label: Text('Foto aufnehmen')
),
),
Итак, я могу сделать фотографию очень хорошо, и она добавляется в список images
, но Observable
никогда не срабатывает.