【问题标题】:How to declare observable in Mobx flutter to trigger when a field of a class is changed?如何在 Mobx Flutter 中声明 observable 以在类的字段更改时触发?
【发布时间】:2021-06-06 19:34:39
【问题描述】:

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

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

这是我店的代码

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),
        ),
      ),
    );
  }
}

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

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

【问题讨论】:

    标签: flutter mobx


    【解决方案1】:

    问题是您只是在更改对象项(值)的值。你必须完全改变对象,然后只有 mobx 找到的值是改变的。

    替换下一行

    cello.value = cadence.toString();
    

    使用以下代码:

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

    【讨论】:

    • 是的,现在可以了。感谢您帮助我们更好地了解 Mobx!
    • 是的,我还必须重新创建对象才能让观察者重建。但是我们不能在不重新创建对象的情况下做到这一点吗?
    • 我不确定,但你可以使用 equatable 包来比较你的对象,我认为它会起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    相关资源
    最近更新 更多