【问题标题】:Choosing the correct Flutter design pattern选择正确的 Flutter 设计模式
【发布时间】:2019-11-05 10:14:27
【问题描述】:

我创建了一个 Flutter 页面,其中包含大量输入。我认为这是一团糟,让我们重构它并为每个输入创建一个新的有状态小部件。

这很好,只是数据需要在父窗口小部件中,而且我很难理解如何将数据从新的子窗口小部件传回父窗口。

我发现了一些 hacky 方式,您可以在其中传递一个函数,并且每当发生更改时,您都会通过该函数将数据传递给父级。有效但现在有多个变量,一个在子级中,一个在父级中.

我已阅读有关 bloc 模式的信息,但我不确定这是否是我需要的。我只想要一个单例样式的对象,主小部件及其子部件都可以读取,并且在有新输入时子部件会更新。

有人能解释一下 bloc 模式是否可以帮助我解决这个问题,或者是否有另一种设计模式可以帮助我解决这个问题。

** 编辑

感谢大家的精彩回答。我的新问题与提供者模式/库有关。

我创建了一些状态类如下(我替换了内容以尽量保持简单)

class State1 with ChangeNotifier{

String _s;

  set s(String newS){
    _s = newS;
    notifyListeners();
  }

}

然后我使用 multiprovider 来传递它(在 init 中创建对象)

child: MultiProvider(
        providers: [
          ChangeNotifierProvider(builder: (context) => state1),
        ],
        child: Stack(
        alignment: Alignment.center,
        children: stackChildren,
      ),

然后使用

在子 Widegets 构建方法中访问它
 state1Var = Provider.of<State1>(context);

所有这一切都很好..

我的问题是当我开始使用导航推送时,我无法再访问该状态。

onPressed: (() {
          Navigator.push(
            contextField,
            MaterialPageRoute(builder: (context) => NewPage()),
          );
        }),

当我得到这个错误

Could not find the correct Provider<State1> above this NewPage Widget...

我确实设法使用它来获得它

  Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => Consumer(builder: (),child: NewPage(),)),
          );

但是当我使用 navigator.pop() 弹出小部件时,无法使用状态,因为它说它已被处理。

对不起,如果我让这变得复杂了。我不得不删除很多代码。

【问题讨论】:

  • 欢迎来到状态管理的世界!如果您对此很陌生,除非您对流有很好的理解,否则 BLoC 可能太复杂了。看看这个:flutter.dev/docs/development/data-and-backend/state-mgmt/simple
  • 您好,感谢您的回复。我已经设法使用提供程序库将大量代码重构为多个文件......这一直很好,直到我使用导航器推送并尝试使用被推送的小部件内的一种状态。我收到此错误,错误:在此 [THE WIDGET I am PUSHING ON] 小部件上方找不到正确的 Provider。你能帮帮我吗?

标签: design-patterns flutter bloc


【解决方案1】:

你需要使用 stateManagement。

它存在 BLoC,但您也可以毫无问题地使用 Provider,它会解决您的问题。

这是 Diego Velasquez 写的关于 Widget Communication 的内容,可以解决您的问题。

但如果您需要更多信息,我会告诉您来自 Karthik Ponnam 的关于 State Management with Provider 的信息。

这将帮助您从Flutter Docs 中更多地了解状态管理是什么

【讨论】:

  • 您好,感谢您的回复。我已经设法使用提供程序库将大量代码重构为多个文件......这一直很好,直到我使用导航器推送并尝试使用被推送的小部件内的一种状态。我收到此错误,错误:在此 [THE WIDGET I am PUSHING ON] 小部件上方找不到正确的 Provider。你能帮帮我吗?
  • 我想看看你是如何管理你的供应商的,请更新最新错误的问题,以便我或其他人可以提供帮助
  • 感谢您的回复。我已经更新了我的问题。我试图让它变得简单。如果任何部分令人困惑,请让我编辑并尝试改进它。
  • 很抱歉询问,但我已经查看了整个互联网并找不到解决方案。请你再帮我一些。 @Argel Bejarano
【解决方案2】:

我认为 BLoC 模式是由 Felix Angelov 开发的。它有许多可以帮助您的示例,并且使用起来非常简单,并且从颤振推荐这里是链接 https://github.com/felangel/bloc

【讨论】:

    【解决方案3】:

    如您所知,当我们有将随时间变化的数据以及我们希望 UI 何时更新时,就会使用 StatefulWidgetStatefulWidget 可以更新数据和不更新数据以及重新渲染屏幕,但问题是它无法扩展到具有多个不同屏幕的大型应用程序。

    使用 StatefulWidget,在应用程序内将数据从一个屏幕传递到另一个屏幕具有挑战性。 StatefulWidget 更像是展示如何在 Flutter 应用程序中传递状态的初学者方式。

    对于生产级应用程序,有 BLOC 模式,这是在 Flutter 应用程序中管理状态的另一种方式。还有其他方法,但 Flutter 团队强烈推荐 BLOC 模式。他们相信这是最好的做事方式。需要明确的是,没有人有专业知识来告诉你该怎么做,但同样,Flutter 团队已经公开支持 BLOC 模式,对我来说,如果你遇到麻烦,这将意味着很好的支持因为很难理解。

    【讨论】:

    猜你喜欢
    • 2018-02-18
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多