什么是实现回调/侦听器模式的正确方法?

时间:2019-10-15 03:09:58

标签: flutter dart

很抱歉,如果这是新手问题。我有以下回购文件:

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”表达式的引用无效

我不知道如何传递回调以接收事件。

3 个答案:

答案 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来呈现一些新数据,则可能要使用FutureStream。无论如何,问题是如何实现回调/侦听器,因此在这里给您一些示例:


您不能使用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()),
              );
            });

        },
      ),
    );
  }
}