很抱歉,如果这是新手问题。我有以下回购文件:
class TwitterRepo {
final TwitterRepoCallback _callback;
TwitterRepo(this._callback){
// do stuff
}
}
abstract class TwitterRepoCallback{
void onEvent();
}
在我的UI文件中,我有以下内容:
class TweetList extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _TweetListState();
}
}
class _TweetListState extends State<TweetList> implements TwitterRepoCallback {
final TwitterRepo _twitterRepo = TwitterRepo(this);
// other stuff like initState, build and onEvent
}
上存在错误
final TwitterRepo _twitterRepo = TwitterRepo(this);
我使用“ this”的地方,对“ this”表达式的引用无效。
我不知道如何传递回调以接收事件。
答案 0 :(得分:0)
尝试一下。
class ParentPageState extends State<ParentPage> implement Callback{
...
@override
void callback(){
...
}
@override
void callback1(String str){
....
}
@override
Widget build(BuildContext context){
return Scaffold(
body : Container(
child : ChildPage(callback : this.callback, callback1 : this.callback1)
)
);
}
}
和ChildPage
import .....
//Main Point
typedef Callback = void Function();
typedef Callback1 = void Function(String str);
class ChildPage extends StatelessWidget{
final Callback _callback;
final Callback1 _callback1;
ChildPage({Callback callback, Callback1 callback1}): _callback : callback, _callback1 : callback1;
.....
@override
Widget build(BuildContext context){
return Container(
child : InkWell(
onPressed : (){
this._callback();
this._callback1("test");
},
child : ....
)
);
}
这可能有问题。要点是“ typedef”
答案 1 :(得分:0)
如果要使用回调通知UI来呈现一些新数据,则可能要使用Future
或Stream
。无论如何,问题是如何实现回调/侦听器,因此在这里给您一些示例:
您不能使用this
声明变量,可以在构造函数上初始化变量
_TweetListState() {
_twitterRepo = TwitterRepo(this);
}
或在initState()
内
@override
void initState() {
super.initState();
_twitterRepo = TwitterRepo(this);
}
一种更好的方法是:
final TwitterRepo _twitterRepo = TwitterRepo();
@override
void initState() {
super.initState();
_twitterRepo.listen(this);
}
在listen
上实现的TwitterRepo
方法将设置回调
您也可以使用VoidCallback
代替TwitterRepoCallback
:
@override
void initState() {
super.initState();
_twitterRepo.listen(() {
// Do stuff
});
}
或者使用Function(String a, int b)
代替TwitterRepoCallback
的回调函数
@override
void initState() {
super.initState();
_twitterRepo.listen((a, b) {
// Do stuff
});
}
答案 2 :(得分:0)
我可能不会针对此类需求使用回调。相反,我将使用某种类似InheritedWidget的系统来获取数据并将其沿小部件树传播。我知道您才刚刚开始,但是一个不错的工具是Provider软件包。要执行您要在此处执行的操作,它将类似于以下内容:
class TwitterRepo extends ChangeNotifier{
//construct Repo
TwitterRepo(){
_setupNetworkListener();
}
List<Data> data = [];
//set up the way to listen to and get data here then add it to your list,
//finally notify your listeners of the data changes
_setupNetworkListener()async{
var _data = await gettingInfo();
data.addAll(_data);
notifyListeners();
}
}
class TwitterRepoUI extends StatefulWidget {
@override
_TwitterRepoUIState createState() => _TwitterRepoUIState();
}
class _TwitterRepoUIState extends State<TwitterRepoUI> {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<TwitterRepo>(
builder: (context)=> TwitterRepo(),
child: Consumer<TwitterRepo>(
builder: (context, model, child){
return ListView.builder(
itemCount: model.data.length,
itemBuilder: (context, index){
return Center(
child: Text(index.toString()),
);
});
},
),
);
}
}