• Mr.J
    2019-08-14
    请你分别概括属性传值、InheritedWidget、Notification 与 EventBus 的优缺点。
    ·属性传值:单页面同一个视图树中使用,或者通过构造方法将值传递过去,有点直接将值带过去,不需要过多的操作,缺点是多层级的Widget需要一层层的传值,效率很低;中间一层忘了传整个下游都中断,而且中间某一个层级修改了数据,上层无法及时更新;
    ·InheritedWidget:主要体现是下层Widget主动去向上层拿数据,实现相对复杂,(有个疑问,多层的视图树,在最下层直接使用of可以获取到最上层的数据吗?),缺点传值方向的单一;
    ·Notification:与InheritedWidget相反,主要体现推数据,针对性强,具体通知给哪个Widget明确,不需要跨多层实现,缺点实现起来相对繁琐点,传值方向单一;
    ·EventBus:订阅关系,针对性强,全局使用,缺点是不同的事件需要定义不同的实体,传递时要区分哪个事件传递给哪个控件,销毁Widget时不能忘记取消订阅;
    展开

    作者回复: 赞
    InheritedWidget 无论跨多少层都可以的

     1
     6
  • 许童童
    2019-08-13
    老师能讲下闲鱼的Redux吗?

    作者回复: 更推荐Provider

     3
     5
  • 许童童
    2019-08-13
    请你分别概括属性传值、InheritedWidget、Notification 与 EventBus 的优缺点。
    属性传值:简单,但跨多个父子节点不方便
    InheritedWidget:跨多个父子节点方便,但修改数据麻烦
    Notification :传递事件方便,读取不方便
    EventBus :通过事件总线,全局,方便,但要记住事件名称,全局容易冲突,组件消除要清理事件。

    作者回复: 赞

    
     2
  • 寂寞不点烟
    2019-12-17
    subscription = eventBus.on().listen((event) { setState(() {msg+= event.msg;});//更新msg });event这样接收会出现事件混乱。应该加一层判断
    if(event.runtimeType == CustomEvent){
            setState(() {
              msg += event.msg;
            }); //更新msg
          }
    展开

    作者回复: 赞

    
     1
  • 淡~
    2019-08-14
    Bloc和scopedmodel等一些状态管理方案会讲吗,更富推荐那些做状态管理啊

    作者回复: 推荐Provider

    
     1
  • JimLai
    2019-12-30
    老师您好,请问flutter可以达到类似安卓ContentProvider实现的跨进程数据通讯的效果吗?例如:一个由flutter开发的app部署到安卓设备上,与另一个原生安卓app进行数据通讯。
    
    
  • 🌝
    2019-11-13
    我通过子widget类直接修改传入的父widget中的变量可以吗?实验过,如果是对象的变量可以直接修改掉。

    class Obj {
      int a;
      String b;

      Obj({this.a, this.b});
    }
    class OneWidget extends StatefulWidget {
      OneWidget({Key key}) : super(key: key);
      @override
      _OneWidgetState createState() => _OneWidgetState();
    }
    class _OneWidgetState extends State<OneWidget> {
      Obj obj;
      @override
      Widget build(BuildContext context) {
        return TwoWidget(obj: obj);
      }
    }

    class TwoWidget extends StatefulWidget {
      final Obj obj;
      TwoWidget({Key key, this.obj}) : super(key: key);
      @override
      _TwoWidgetState createState() => _TwoWidgetState();
    }
    class _TwoWidgetState extends State<TwoWidget> {
      @override
      Widget build(BuildContext context) {
        return FlatButton(
          onPressed: () {
            widget.obj.a = 123;
          },
          child: Text('点击'),
        );
      }
    }
    展开

    作者回复: 可以啊,对象是引用传递就没问题

    
    
  • 和小胖
    2019-09-10
    老师,dispose() { subscription.cancel();} 这里的 subscription 哪里来的呢?不是应该是 eventbus.destroy() 吗?

    作者回复: 注册通知(调用listen)的时候会返回一个监听对象,用于后续取消事件通知

    
    
  • 和小胖
    2019-09-10
    老师,上面提的问题似乎找到答案了。

    把 _incrementCounter 传入到 CountContainer 里面或许是为了类似于 java 里面的多态,子类可以有很多,同时子类可以自定义很多自己的方法,但是在调用的时候都统一调用父类的同名方法。

    而我用 state.increment 之所以不行,是因为我是 onPressed: () => state.increment 这样写的,如果改成 onPressed: () => state.increment() 其实也是可以的,或者按照老师那种 onPressed 的写法也是可以的。

    onPressed: () => state.increment() 是否可以认为是在 onPressed 的回调响应里面调用了 state 的 increment() 方法而已,而 onPressed: state.increment 是不是可以看成是在拿 state 的 increment 属性在给 onPressed 这个属性赋值呢?
    展开

    作者回复: 赞,你已经得出正确结论了

    
    
  • 和小胖
    2019-09-10
    老师,请问下第一种父传子的方式,为啥要把 _incrementCounter 传入到CountContainer里面呢?在按钮的点击事件里面直接使用 state.model._incrementCounter() 不是也可以吗?

    另外我发现我用state.model._incrementCounter()是可以,但是使用 state.increment 却无法让 数字变化,这是为什么呢?

    作者回复: 1.直接使用State当然可以呀,只是这个例子是演示如何通过InheritedWidget进行读写数据。InheritedWidget只能读不能写,要写数据得通过State中转一层
    2.看评论你已经得出结论啦

    
    
  • 咖啡凉了
    2019-09-09

    class Counter extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        // 获取 InheritedWidget 节点
        CountContainer state = CountContainer.of(context);
        return Scaffold(
          …
          body: Text(
            'You have pushed the button this many times: ${state.model.count}', // 关联数据读方法
          ),
          floatingActionButton: FloatingActionButton(onPressed: state.increment), // 关联数据修改方法
        );
      }
    }
    我在尝试的时候遇到了问题,这段代码中的 state.increment ,没有反应,改成state.increment()才能响应。这是什么问题
    展开

    作者回复: 这段代码应该是没问题的,如果是用箭头函数才会有问题

    
    
  • 历史课代表
    2019-09-04
    可以讲一下EventBus在Flutter中怎么实现的吗

    作者回复: EventBus原理比较简单,通过一个可以被多人共享(订阅)的数据流就可以实现事件的分发。Dart的event_bus实际上就是通过一个可以被多个人订阅的Stream实现的,而其底层的StreamController就是专门用来给Steam制造数据的。

    
    
  • 看不懂的你
    2019-08-29
    老师具体讲一下provider的实现与思想,还有bloc的sixiabg

    作者回复: Provider会讲的

    
    
  • ptlCoder
    2019-08-27
    系统没有提供缓存相关API嘛?

    作者回复: 有啊。但是对于跨组件传递数据,存取方式并不重要,重要的是存好了怎么通知其他组件来取

    
    
  • davidzhou
    2019-08-23
    eventbus的事件处理必须在同一个对象里面,那大大的降低了灵活性,在iOS里面通用的nsnotificationcenter,就是为了方便在非关联的对象之间能方便的传递信息

    作者回复: 把event bus封装成单例就可以了

    
    
  • 给我点阳光就灿烂
    2019-08-20
    想问一下老师,这几种传递方式哪一种更高效呢

    作者回复: Event Bus是最简单高效的,不过还得看具体场景。

    
    
  • 倒霉的香蕉
    2019-08-14
    把FirstScreen和SecondScreen作为两个TabBarView来切换,这样的话 EventBus好像没用了。 是不是只能是通过Navigator进行的组件切换才能用EventBus。

    作者回复: 你把两个页面都换成StatefulWidget再看一下

    
    
我们在线,来聊聊吧