【问题标题】:Flutter - How to call functions (and variables) between stateful widgets?Flutter - 如何在有状态的小部件之间调用函数(和变量)?
【发布时间】:2021-10-12 09:12:19
【问题描述】:

我在一个小部件(主屏幕)中有这个功能:

void toggleRecording() async {

  // HERE IS THE CONFUSION I GUESS
  _isRecording = !_isRecording;
  recorder = SoundStream(isRecording: _isRecording);

  //recorder.toggleRecording(_isRecording);
  setState(() {
    _isRecording = recorder.isRecording;
  });
  if (_isRecording) {
    startTimer();
    _stopwatch.start();
  } else {
    stopTimer();
    _stopwatch.stop();
  }
}

它需要调用(触发)我的记录器类中的另一个函数:

void toggleRecording() async {

  widget.isRecording  ////// currently being passed as an argument from homescreen

      ? {_recorder.stop, await save(_micChunks, 44100)}
      : _recorder.start;
}

此外,布尔变量_isRecording 存在于两个类中。如何同步状态?

【问题讨论】:

  • 这是一个状态管理问题 试用 provider 或 riverpod for starters,您可以在其中跨多个小部件公开某些状态。
  • 我试过提供者。无法让所有东西协同工作。
  • Provider 一开始确实很容易,但在某些时候要让所有东西都工作起来有点困难。试用 Riverpod,在我看来,这是 Provider 的生产就绪版本。 1.0 版也即将推出~ish。

标签: flutter dart state parameter-passing


【解决方案1】:

在您的情况下,通过小部件传递函数引用将起作用。然而,最好的做法是使用provider package

从提供者管理功能将允许您控制所有页面的功能。

如果你改变一个变量,你可以在你的提供者函数中调用 notifylistener() 函数。这样您就可以更改小部件的状态。

我会试着一目了然地解释它,但是这是颤振的一个重要主题。

这是我的文件夹结构

在提供者文件夹中,我们定义了我们的提供者类。

首先我定义了扩展 changeNotifier 类的类。这就是这个类提供者的原因。

旁注:如果您在该类中使用任何变量,并且这就是您要搜索的内容,则 notifyListener() 函数在此处调用每个小部件的 setState。

然后我将它导入到我的 main.dart 文件或您想要的任何文件中。唯一的条件是在您将使用提供程序的小部件上方。

如果您导入提供程序包并像我在此代码中所做的那样定义您的提供程序,最后您可以在任何地方使用您的函数。

最后是provider包的可视化结构。

我希望我解释得很好。 youtube上有更多关于它的信息。

【讨论】:

  • 你能展示一些代码示例吗?
【解决方案2】:
Pass the function to other widget 
using Function keyword


Say ContentWidget is your child and ParentWidget is parent

class ParentWidget extends StatefulWidget {

//Do Something
void onSomeFunction()
{
ContentWidget(onTimerUpdate:onTimerClosed)

}

void onTimerClosed()
{
//Perform Operation on Timer Change
}



}

class ContentWidget extends StatefulWidget {
 final Function onTimerUpdate;

ContentWidget({
 Key key,
 @required this.onTimerUpdate,
  }) : super(key: key);

void onAnyActionFromChild()
{
widget.onTimerUpdate() //Note () can have any param or can be null
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2020-05-27
    • 2020-07-31
    • 2021-05-19
    相关资源
    最近更新 更多