Flutter Mobx Observer不会重建

时间:2019-12-09 21:07:11

标签: flutter mobx

我不知道了。

我正在使用Mobx进行非常简单的状态管理。

import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:jw_helper/state/globalState.dart';

class Router extends StatelessWidget {
  const Router({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final _globalState = GlobalState();
    return Column(
      children: <Widget>[
        Container(
          child: Observer(
            builder: (_) => Text(_globalState?.currentIndex?.toString()),
          ),
        ),
        MaterialButton(
          onPressed: () {
            _globalState.setCurrentIndex(1);
          },
          child: Text("Press me"),
        ),
      ],
    );
  }
}

当我在此小部件中更改状态时,值会更新。 当我在另一个小部件中更改相同的Observable时,Observer不会重建。

仅更新状态被更改的同一小部件​​中的观察者。

我的Mobx代码:

import 'package:mobx/mobx.dart';

// Include generated file
part 'globalState.g.dart';

// This is the class used by rest of your codebase
class GlobalState = _GlobalState with _$GlobalState;

// The store-class
abstract class _GlobalState with Store {
  @observable
  int currentIndex = 0;

  @action
  void setCurrentIndex(index) {
    currentIndex = index;
    print(currentIndex);
  }
}

小注释:Print Statement始终会被触发

也许有人知道如何解决此问题。 谢谢;)

3 个答案:

答案 0 :(得分:0)

该问题已在Discord Mobx渠道成员的帮助下解决。

解决方案是将整个应用程序包装在提供程序小部件中。

class MyApp extends StatelessWidget {
  @override
    Widget build(BuildContext context) {
------------------------------------------------
    return Provider<GlobalState>(
      create: (context) => GlobalState(),
------------------------------------------------
      child: MaterialApp(
        title: 'Flutter Demo',
        debugShowCheckedModeBanner: false,
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: SplashScreen(),
      ),
    );
  }
}

在使用Mobx类的小部件中,我做到了:

class Router extends StatelessWidget {
  const Router({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final _globalState = Provider.of<GlobalState>(context);
    return Column(
      children: <Widget>[
        Container(.....

希望这可以帮助某人起床并运行;)

答案 1 :(得分:0)

不是完成(也不是)的应用程序,但希望可以作为一个开始。

Flutter + Mobx +(多个)提供程序

https://github.com/jonataswalker/flutter-example

答案 2 :(得分:0)

您有两个 GlobalState 类的实例。每个小部件一个。为了让 Observer 正常工作,它需要始终观察同一个实例。

使用“Provider”,你是在使用单例模式来解决这个问题,因为两个变量都开始引用同一个实例