初始化和提供程序出现抖动问题

时间:2019-07-14 12:36:14

标签: flutter provider state-management bloc

我对提供者模式有疑问,我对我的问题有解决方案,我只是想检查它的好方法,如果有更好的替代方法。

当文本控制器文本第一次加载窗口小部件以将值存储在提供者状态中时,我正在尝试更新它们。最初,我只是在init中创建了文本控制器,然后将状态加载到了build方法中并设置了控制器文本。

这一直有效,直到我想对内容进行一些验证,以防止某些事物进入状态(例如,防止空字符串)。

textController.addListener(() {

         if( RULE ABOUT WHETHER TO SET STATE BASED ON TEXT){
            state.textField = textController.text;         
          }
    });

这里出现了问题,因为他们的用户将删除他们的单词,这将使规则失败。重建将发生(因为他们已经按下了一个键),然后text.controller会重建到状态中的状态(失败则是单个字母)。有效地,这阻止了他们删除,这是我希望他们能够执行的操作,但是这样做不能更新状态。

我发现这个库https://pub.dev/packages/after_layout允许重写一个方法,该方法在构建后立即被调用一次。

我的解决方案通过在initstate中创建文本控制器来使用它。 将其分配给构建中的TextField。

然后创建一个本地字段,该字段将保留textField小部件字符串的内容。

然后在新的afterbuild方法中,我将为变量分配状态内容,并更新文本控制器文本以具有此值。

然后在text.controllers文本更改为侦听器中,我使用规则仅在满足规则时更新此状态。因此,如果他们删除了内容,他们将无法再打开/关闭窗口小部件,则状态将重新生成,仍然具有有效值。

使用此库是对此的一个很好的解决方案,还是有更好的技术?

----------------编辑

对不起,我冗长的第一部分。我认为我的主要问题是,如果我需要的数据必须来自构建中的状态,我该如何初始化Controller。

例如。

// This must go in the build as it requires state
myTabsController = TabController(length: myState.list.length, vsync: this);

每次构建控制器时,我都会初始化该控制器。。。我打算把它放在init中,但仍然访问状态变量。

(我已经尝试过使用AfterLayoutMixin中的afterFirstLayout()回调,但这只会引起更多问题。

请让我澄清更多。 谢谢你的帮助。

0 个答案:

没有答案