选择正确的Flutter设计模式

时间:2019-06-23 09:02:35

标签: design-patterns flutter bloc

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

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

我发现了一种让人讨厌的方式,您可以在其中传递函数,并且每当发生更改时,您都可以通过该函数将数据传递给父级。工作,但是现在有多个变量,一个在子级中,一个在父级中

我已经阅读了有关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,
      ),

然后使用

在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()弹出窗口小部件时,无法使用该状态,因为它说它已经被丢弃了。

对不起,如果我把它弄复杂了。我不得不删除很多代码。

3 个答案:

答案 0 :(得分:0)

您需要使用stateManagement。

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

这是迭戈·韦拉斯克斯(Diego Velasquez)关于Widget Communication写的,可以解决您的问题。

但是,如果您需要更多信息,我会给您Karthik Ponnam的有关State Management with Provider的信息。

这将帮助您更多地了解Flutter Docs

的状态管理是什么

答案 1 :(得分:0)

您知道,只要我们有随时间变化的数据以及我们希望用户界面更新的时间,就会使用 StatefulWidget StatefulWidget 可以更新数据和不更新数据,并且可以重新渲染屏幕,但是问题在于它无法扩展到具有多个不同屏幕的大型应用程序。

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

对于生产级别的应用程序,有 BLOC模式,这是在Flutter应用程序内部管理状态的另一种方法。还有其他方法,但是 BLOC模式是颤振团队强烈建议的。他们相信这是最好的做事方式。需要明确的是,没有人可以告诉您该怎么做的专业知识,但是作为国际风云榜,扑扑团队再次公开认可了 BLOC模式,对我来说,如果您愿意遇到麻烦是因为难以理解。

答案 2 :(得分:0)

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