【问题标题】:is is ok if show progress indicator inside the viewmodel pattern?( Flutter question)如果在视图模型模式中显示进度指示器可以吗?(颤振问题)
【发布时间】:2020-12-29 22:06:41
【问题描述】:

我在我的项目中使用 MVVM 模式,我通过将构建上下文传递给视图模型方法来显示视图模型中的微调器 例如:

void getSomeData(BuildContext context,int someDataID){

        showSpinner(context);
}

上面提到的方法getSomeData(....)是从屏幕文件中调用的 它工作正常,但我只想知道这会有什么问题吗?

谢谢

【问题讨论】:

  • 请修正您的代码格式

标签: flutter mvvm


【解决方案1】:

我认为使用 是一种不错的模式,但是 将来当您的应用程序变得更大时,它可能会导致问题。您可能会去调试您的视图模型和视图,或者您想扩展一些基于微调器或与微调器密切相关的功能,并且发现很难在代码中导航以找到您想要的东西,因为视图模型和视图非常交织在一起。

严格来说,视图模型应该通过视图模型中保存的状态变量来引导视图,而不是允许视图模型通过context 直接更改视图。这有助于将所有build 代码保留在视图中,并将控制它的所有逻辑保留在视图模型中。下面是我的意思是使用ChangeNotifier 作为视图模型的示例(使用provider 包)例如

class ViewModel extends ChangeNotifier {
    bool _showSpinner = false;

    bool get shouldShowSpinner => _showSpinner;

    void showSpinner() {
        _showSpinner = true;
        notifyListeners() // (Method for ChangeNotifiers) Or equivalent call to rebuild the view
    }

    void hideSpinner() {
        _showSpinner = false;
        notifyListeners() // (Method for ChangeNotifiers) Or equivalent call to rebuild the view
    }
}

class View extends StatelessWidget {

    @override
    Widget build(BuildContext context) {
        return ChangeNotifierProvider<ViewModel>(
            create: (context) => ViewModel(),
            child: Consumer<ViewModel>(
                build: (context, model, child) {
                    return Stack(
                        children: [
                            SomePageContents(),
                            if (model.shouldShowSpinner) Spinner(),
                        ],
                    );
                }
            )
        );
    }
}

重申一下,我认为这有助于长期的可维护性,但如果您的方法适合您,即您的项目范围相对较小并且您的原始方法不会导致太多的依赖问题,那么我会说用你原来的方式做,因为 MVVM 方法应该有助于不阻碍开发。

【讨论】:

  • 这正是我想知道的问题。非常感谢兄弟
  • 没问题!乐于助人:)
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 2023-03-03
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
相关资源
最近更新 更多