Flutter 颤振子到父回调
我在父类中有一个简单的ListView.BuilderFlutter 颤振子到父回调,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(
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
}