gpt4 book ai didi

Flutter MobX Observer 不会在@action 上触发

转载 作者:行者123 更新时间:2023-12-05 02:57:22 32 4
gpt4 key购买 nike

我正在使用一个 MultiProvider 来包装我的整个应用程序。我已经在使用另一个 Store/Observer 进行身份验证/登录,并且该部分可以正常工作。我刚刚添加了另一个商店,它反射(reflect)了用户拍摄的照片,然后在上传之前在两个不同的地方显示。

“拍照”和“将它们插入商店”工作正常。然后应该 react 性地显示照片的部分……没那么多。

相关代码:

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 是因为我认为在 Observer 中访问 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 永远不会触发。

最佳答案

好吧,看来这部分

@observable
List<File> images = [];

不工作(目前?)

替换为

final images = ObservableList<File>.of([]);

会产生想要的结果

关于Flutter MobX Observer 不会在@action 上触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59760465/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com