Flutter MobX Observer не срабатывает при действии @action - PullRequest
0 голосов
/ 16 января 2020

Я использую 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 никогда не срабатывает.

1 Ответ

0 голосов
/ 16 января 2020

Хорошо, кажется, что эта часть

@observable
List<File> images = [];

не работает (в настоящее время?)

Замена ее на

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

даст желаемые результаты

...