【问题标题】:How to call a function within a child widget?如何在子小部件中调用函数?
【发布时间】:2021-11-01 03:50:58
【问题描述】:

我有一个具有音频播放器和按钮的子小部件,当我按下该按钮时,它会调用playAudio() 方法,该方法会按预期播放音频,因为所有内容都包含在一个文件中。

但是,子小部件嵌套在父小部件中,我不知道如何从父小部件调用相同的 playAudio() 方法。

如何让父窗口小部件中的Parent Play Button 调用子窗口小部件中的方法?

另外:我读到 Flutter 鼓励setState,在这种情况下,如何使用setState 来触发音频?

家长小部件

import 'package:flutter/material.dart';
import 'package:phonica/audio_test/child.dart';

class ParentWidget extends StatefulWidget {
  ParentWidget();

  @override
  _ParentWidgetState createState() => _ParentWidgetState();
}

class _ParentWidgetState extends State<ParentWidget> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Center(
            child: Container(
              width: 300.0,
              height: 100.0,
              color: Colors.green,
              alignment: Alignment.center,
              child: TextButton(
                child: Text("Parent Play Button"),
                onPressed: () => {}, // <-- Call child widget's playAudio()
              ),
            ),
          ),
          ChildWidget(),
        ],
      ),
    );
  }
}

儿童小部件

import 'package:flutter/material.dart';
import 'package:audioplayers/audioplayers.dart';

class ChildWidget extends StatefulWidget {
ChildWidget();

  @override
  _ChildWidgetState createState() => _ChildWidgetState();
}

class _ChildWidgetState extends State<ChildWidget> {
  final audioPlayer = AudioCache(fixedPlayer: AudioPlayer());

  playAudio() {
    String audioFile = "audio/words/alive_0.mp3";
    audioPlayer.play(audioFile);
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      width: 300.0,
      height: 100.0,
      color: Colors.amber,
      child: TextButton(
        child: Text("Child Play Button"),
        onPressed: () => {playAudio()},
      ),
    );
  }
}

【问题讨论】:

标签: android flutter dart


【解决方案1】:

您必须通过 GestureDetector() 包装您的父窗口小部件,然后使用 onTap 调用该函数。见下文

GestureDetector(
          onTap: () {
            setState(() {
              // Toggle light when tapped.
              _lightIsOn = !_lightIsOn;
            });
          },
          child: Container(
            color: Colors.yellow.shade600,
            padding: const EdgeInsets.all(8),
            // Change button text when light changes state.
            child: Text(_lightIsOn ? 'TURN LIGHT OFF' : 'TURN LIGHT ON'),
          ),
        ),

【讨论】:

  • 这对我不起作用,因为我想通过代码调用该函数,而不仅仅是通过用户输入。我该怎么做?
猜你喜欢
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 2020-02-26
  • 2021-09-10
  • 2021-12-04
  • 2021-05-04
相关资源
最近更新 更多