alibaba / fish-redux

An assembled flutter application framework.
https://github.com/alibaba/fish-redux
Apache License 2.0
7.33k stars 843 forks source link

请问slots的key有过滤方法吗? #546

Closed Wanchen7 closed 4 years ago

Wanchen7 commented 4 years ago

Page下面有一个父component,父component下面也有多个子component。Page根据后台返回的json进行页面显示。

伪代码如下

//page
APage extends Page<AState, String> {
  APage()
      : super(
          initState: initState,
          view: buildView,
          dependencies: Dependencies<StoryState>(
              slots: <String, Dependent<AState>>{
                   "type1":AStateConnector() + Type1Component(),
                   "type2":AStateConnector() + Type2Component(),
                   ....
              }),
        );
}

//父组件
BComponent extends Component<ComponentState>{
  BComponent()
      : super(
          view: buildView,
          effect: buildEffect(),
          reducer: buildReducer(),
          dependencies: Dependencies<ComponentState>(
              slots: <String, Dependent<ComponentState>>{
                "a1": ComponentStateConnector() + A1SubComponent(),
                "a2": ComponentStateConnector() + A2SubComponent()
                ...
              }),
        );
}

//子组件
A1SubComponent extends Component<ComponentState> {
  A1SubComponent()
      : super(
          view: buildView,
        );
}

假如后台数据结构不变 ,也就是层级还是 一个page 一个父组件 多个子组件的布局,但是对应slots里面的type变化了,比如新增了多个type,但是客户端没有在slots中定义这个type。有什么办法可以把没有定义的type都显示成默认的component吗?或者有过滤的方法吗?还是说这样的代码写法不太对?

zjuwjf commented 4 years ago

需要一个类似于 viewService.isSlotExisted(String) api ?

Wanchen7 commented 4 years ago

需要一个类似于 viewService.isSlotExisted(String) api ?

我这边运行报错如下,b1是新增的type。

Could not found component by name "b1."

'package:fish_redux/src/redux_component/context.dart':
Failed assertion: line 85 pos 12: 'result != null'

有没有类似 slotsFilter 的方式? viewService.isSlotExisted(String) 是在buildView里面处理的吧?

zjuwjf commented 4 years ago

slotsFilter 是怎么使用的,伪代码即可

Wanchen7 commented 4 years ago

抱歉,忽略slotsFilter的说法。

能否这样:

buildComponent在slots找不到的时候,返回个用户自己配置的widget

///package:fish_redux/src/redux_component/context.dart 

  @override
  Widget buildComponent(String name,{Widget defaultWidget}) {
    .....
    return result ?? defaultWidget ;
  }

我的理解是slots类似 switch case ,现在少了个 default。

Wanchen7 commented 4 years ago

@zjuwjf 大佬 这样可行吗

zjuwjf commented 4 years ago

嗯,可以考虑提一个PR上来。 对类似的场景有个通用的简单处理。

Wanchen7 commented 4 years ago

@zjuwjf 已提交,麻烦大佬看一哈。我先close了 https://github.com/alibaba/fish-redux/pull/550