我创建了一个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()弹出窗口小部件时,无法使用该状态,因为它说它已经被丢弃了。
对不起,如果我把它弄复杂了。我不得不删除很多代码。
答案 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