【发布时间】: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