flutter - 如何在 Mobx flutter 中声明 observable 以在类的字段更改时触发?

标签 flutter mobx

我正在学习 Mobx Flutter,并且希望有一个观察者显示类中字段的修改。

当使用 int 而不是自定义类时,它可以工作。 所以我怀疑我没有正确声明商店中的类(class)

这是我商店的代码

import 'package:mobx/mobx.dart';

// generated file
part 'bikeModel.g.dart';

class Cell {
  String description;
  String value;
  String unit;

  Cell({this.description, this.value, this.unit});
}

class BikeData = _BikeData with _$BikeData;

abstract class _BikeData with Store {
  Timer _timerSimu;

  @observable
  int cadence = 0;

  @observable
  Cell cello = Cell(description: 'desc', value: 'oo', unit: 'km/h');

  @action
  startSimul() {
    int _tick = 0;
    cadence++;
    cello.value = cadence.toString();
    _timerSimu = Timer.periodic(Duration(seconds: 1), (timer) {
      print('Screen simu is ticking...$_tick');
      _tick++;
      cadence++;
    });
  }

  @action
  stopSimu() {
    _timerSimu.cancel();
  }
}

这是主要代码

import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:mobx_first/bikeModel.dart';

import 'globals.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MobX',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage();

  @override
  Widget build(BuildContext context) {
    BikeData store = BikeData();

    return GestureDetector(
      onPanUpdate: (details) {
        if (details.delta.dx > 0) {
          // Right swipe
          print('this is a right swipe');
        } else {
          // left swipe
          print('this is a left swipe');
        }
      },
      child: Scaffold(
        appBar: AppBar(
          title: Text('MobX Test'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Observer(
                  builder: (_) => Text('cello.value ${store.cello.value}')),
              Observer(builder: (_) => Text('cadence ${store.cadence}')),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: store.startSimul,
          tooltip: 'Change',
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

节奏正在改变屏幕上的所有内容,但不改变 cello.value

声明大提琴可观察的正确方法是什么?

最佳答案

问题是您只是更改对象 item(value) 的值。你必须完全改变对象,然后只有 mobx find 值改变。

替换以下行

cello.value = cadence.toString();

使用以下代码:

cello = Cell(
    description: cello.description,
    value: cadence.toString(),
    unit: cello.unit);

关于flutter - 如何在 Mobx flutter 中声明 observable 以在类的字段更改时触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61438788/

相关文章:

dart - 向左或向右滑动以选择( flutter )

javascript - 我们如何在 mobx-state-tree 中维护文件类型 "File"

javascript - 如何在 Mobx 中执行可观察函数?

javascript - 如何取消订阅 mobx-state-tree 中的 onSnaphot() ?

flutter - 即使在 setState 之后,复选标记也不会显示在 flutter 复选框上

Flutter:SliverPersistentHeader 在滚动时重建自身

flutter - 在 StreamBuilder 中使用 AnimatedList

android - 状态更改后未调用 Flutter Bloc Builder 且未更新 UI

javascript - 如何为 Mobx 启用装饰器?

javascript - "this"在我的类(class)中未定义