选择正确的 Flutter 设计模式

Choosing the correct Flutter design pattern

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

这很好,除了数据需要在 parent 小部件中,我很难理解如何将数据从新的 child 小部件传回 parent.

我发现了一些 hacky 方法,你可以传入一个函数,只要有变化,你就可以通过该函数将数据传递给 parent。可行,但现在有多个变量,其中一个在child 和 parent.

中的一个

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

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

** 编辑

感谢各位的精彩解答。我的新问题与提供商 pattern/library 有关。

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

class State1 with ChangeNotifier{

String _s;

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

}

然后我使用多提供商来传递它(在 init 中创建 objects)

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

然后使用

在 children 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,但您也可以毫无问题地使用 Provider,它将解决您的问题。

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

但如果您需要更多信息,我会让您从 Karthik Ponnam 那里得到一些关于 State Management with Provider 的信息。

这将帮助您从 Flutter Docs

中更多地了解什么是状态管理

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

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

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

我认为 BLoC 模式是由 Felix Angelov 开发的。它有很多可以帮助你的例子,它使用起来非常简单,这里推荐的 flutter 是 link https://github.com/felangel/bloc