选择正确的 Flutter 设计模式

ebg*_*g11 14 design-patterns flutter bloc

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

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

我发现了一些方法,你传入一个函数,只要有变化,你就通过该函数将数据传递给父级。

我已经阅读了有关集团模式的内容,但我不确定这是否是我所需要的。我只想要一个单例样式对象,当有新输入时,主小部件及其子部件都可以读取并更新子部件。

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

** 编辑

谢谢你们的好答案。我的新问题与提供者模式/库有关。

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

class State1 with ChangeNotifier{

String _s;

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

}

Run Code Online (Sandbox Code Playgroud)

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

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

然后使用子项widegets构建方法访问

 state1Var = Provider.of<State1>(context);

Run Code Online (Sandbox Code Playgroud)

所有这些都很好用..

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

onPressed: (() {
          Navigator.push(
            contextField,
            MaterialPageRoute(builder: (context) => NewPage()),
          );
        }),
Run Code Online (Sandbox Code Playgroud)

当我收到此错误时

Could not find the correct Provider<State1> above this NewPage Widget...
Run Code Online (Sandbox Code Playgroud)

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

  Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => Consumer(builder: (),child: NewPage(),)),
          );
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

您需要使用状态管理。

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

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

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

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