Flutter 颤振子到父回调

Flutter 颤振子到父回调,flutter,dart,Flutter,Dart,我在父类中有一个简单的ListView.BuilderParentRandomRender Expanded( child: Container( child: ListView.builder( padding: EdgeInsets.only(top: 10), itemCount: _data.length, itemBuilder: (context, index) { return GestureDetector(

我在父类中有一个简单的ListView.Builder
ParentRandomRender

Expanded(
  child: Container( 
    child: ListView.builder(
      padding: EdgeInsets.only(top: 10),
      itemCount: _data.length,
      itemBuilder: (context, index) {
        return GestureDetector(
        onTap: () {
          print("do something");
        },
        child: Container(
          width: 44.0,
          height: 44.0,
          child: Align(
            child: new Image.asset(
              'images/save.png',
              width: 24.0, 
              height: 24.0
            ),
          )
        )
      },
    )
  )
)
onTap工作正常,它在
ParentRandomRender
中实现了我想要的功能

现在我希望我的代码更干净,所以我创建了一个
ChildRandomRow
类,并将
GestureDetector
放入其中,如下所示

class `ChildRandomRow` extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        print("do something");
      },
      child: Container(
        width: 44.0,
        height: 44.0,
        child: Align(
          child: new Image.asset(
            'images/save.png',
            width: 24.0, 
            height: 24.0
          ),
        )
      )
    )
  }
}
现在在
parentrandomdrender
中,我执行以下操作

Expanded(
  child: Container( 
    child: ListView.builder(
      padding: EdgeInsets.only(top: 10),
      itemCount: _data.length,
      itemBuilder: (context, index) {
        return ChildRandomRow(); // on tap callback?
        )
      },
    )
  )
),

如何将onTap回调从
ChildRandomRow
捕获或传递回其
ParentRandomRender
类?

您应该将函数传递给
ChildRandomRow
。然后,您可以在
onTap
中调用它

class ChildRandomRow extends StatelessWidget {
  final Function callback;

  const ChildRandomRow({this.callback}); //making it a named parameter, not required, but easier

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      // 1st option
      onTap: () {
        print("do something");
        callback();
      },
      // 2nd option
      onTap: callback, // if this doesn't work, try anonymous function aka () => callback(),
      ...
    )
  }
}
如何使用它 下面是如何在代码中实现回调

Expanded(
  child: Container( 
    child: ListView.builder(
      padding: EdgeInsets.only(top: 10),
      itemCount: _data.length,
      itemBuilder: (context, index) {
        return ChildRandomRow(
          callback: () {
            print("callback");
          },
        );
      },
    )
  )
),

一种方法是,像这样为回调声明一个
抽象类

abstract class MyCallback {
  void onPositive(String data);
  void onNegative();
}
然后在
ChildRandomRow
中声明此
MyCallback

class ChildRandomRow extends StatelessWidget {
  MyCallback mMyCallback;

  ChildRandomRow([this.mMyCallback]);
....
//do this inside onTap()
       onTap: () {
          mMyCallback.onPositive('YOUR DATA');
         },
class _ParentRandomRender extends State<ContactUs> implements MyCallback {

  @override
  void onNegative() {}

  @override
  void onPositive(String data) {
// DO YOU LOGIC
  }


现在,在
parentrandomdrender
上实现这个
MyCallback

class ChildRandomRow extends StatelessWidget {
  MyCallback mMyCallback;

  ChildRandomRow([this.mMyCallback]);
....
//do this inside onTap()
       onTap: () {
          mMyCallback.onPositive('YOUR DATA');
         },
class _ParentRandomRender extends State<ContactUs> implements MyCallback {

  @override
  void onNegative() {}

  @override
  void onPositive(String data) {
// DO YOU LOGIC
  }