【问题标题】:Flutter Mobx Observer doesnt rebuildFlutter Mobx Observer 没有重建
【发布时间】:2021-12-12 04:08:22
【问题描述】:

我已经没有想法了。

我正在使用 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"),
        ),
      ],
    );
  }
}

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

仅更新状态发生突变的同一 Widget 中的观察者。

我的 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);
  }
}

小提示:打印语句总是被触发

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

【问题讨论】:

    标签: flutter mobx


    【解决方案1】:

    问题已在 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(.....
    

    希望这可以帮助某人启动和运行;)

    【讨论】:

    • 这是否意味着我的应用程序中的每个状态都必须是 GlobalState 的一部分?
    • @LêQuangBảo 您可以按照here的说明使用 MultiProvider
    【解决方案2】:

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

    Flutter + Mobx +(多)提供者

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        遇到同样的问题

        在您在主存储文件中进行任何更改后,始终重建 mobX

        flutter pub run build_runner build --delete-conflicting-outputs

        【讨论】:

          猜你喜欢
          • 2020-05-02
          • 1970-01-01
          • 1970-01-01
          • 2021-08-18
          • 1970-01-01
          • 2019-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多