fish-redux icon indicating copy to clipboard operation
fish-redux copied to clipboard

自定义 component 使用 dispatch报错

Open wangemng opened this issue 3 years ago • 9 comments

enum HomeBaseGoodsAction { action }

class HomeBaseGoodsActionCreator { static Action onAction() { return const Action(HomeBaseGoodsAction.action); } }

在 view页面调用dispatch(HomeBaseGoodsActionCreator.onAction())

在 effect 不会 然后在 reducer.dart 里面接收的时候就会报错

这是我的根 page 页面 WX20200822-154825

这是我的Connector页面 image

这是我的Component 页面 image

image

求结局

wangemng avatar Aug 21 '20 09:08 wangemng

报错还不明显吗, called on null

zsfbest avatar Aug 25 '20 07:08 zsfbest

@zsfbest 你有例子吗 借我看一下呗 这困扰我太久了 我自动生成一个 component 在 view 中调用 dispath 就报错

wangemng avatar Aug 25 '20 09:08 wangemng

@zsfbest 你有例子吗 借我看一下呗 这困扰我太久了 我自动生成一个 component 在 view 中调用 dispath 就报错

你去把官方的例子看一遍就懂了

zsfbest avatar Aug 25 '20 09:08 zsfbest

@zsfbest你有例子吗借我看一下呗这损坏我太久了我自动生成一个component在视图中调用dispath就报错

你去把官方的例子看一遍就懂了

我看了 感觉没问题阿 我估计就是 connector 有的问题 但是看着没啥毛病阿 醉了

wangemng avatar Aug 25 '20 09:08 wangemng

@zsfbest你有例子吗借我看一下呗这损坏我太久了我自动生成一个component在视图中调用dispath就报错

你去把官方的例子看一遍就懂了

我看了 感觉没问题阿 我估计就是 connector 有的问题 但是看着没啥毛病阿 醉了

你把你完整的贴出来直接帮你改了

zsfbest avatar Aug 25 '20 10:08 zsfbest

以下我的 components action

` import 'package:fish_redux/fish_redux.dart';

//TODO replace with your own action enum HomeActivityAction { action }

class HomeActivityActionCreator { static Action onAction() { return const Action(HomeActivityAction.action); } }

` component

`import 'package:fish_redux/fish_redux.dart';

import 'effect.dart'; import 'reducer.dart'; import 'state.dart'; import 'view.dart';

class HomeActivityComponent extends Component<HomeActivityState> { HomeActivityComponent() : super( effect: buildEffect(), reducer: buildReducer(), view: buildView, dependencies: Dependencies<HomeActivityState>( adapter: null, slots: <String, Dependent<HomeActivityState>>{ }),);

} `

effect

`import 'package:fish_redux/fish_redux.dart'; import 'action.dart'; import 'state.dart';

Effect<HomeActivityState> buildEffect() { return combineEffects(<Object, Effect<HomeActivityState>>{ // HomeActivityAction.action: _onAction, }); }

// void _onAction(Action action, Context<HomeActivityState> ctx) { // } `

reducer

`import 'package:fish_redux/fish_redux.dart';

import 'action.dart'; import 'state.dart';

Reducer<HomeActivityState> buildReducer() { return asReducer( <Object, Reducer<HomeActivityState>>{ HomeActivityAction.action: _onAction, }, ); }

HomeActivityState _onAction(HomeActivityState state, Action action) { final HomeActivityState newState = state.clone(); print("object"); return newState; } ` state

`import 'package:fish_redux/fish_redux.dart';

class HomeActivityState implements Cloneable<HomeActivityState> { String imageName; @override HomeActivityState clone() { return HomeActivityState()..imageName= imageName; } }

HomeActivityState initState(Map<String, dynamic> args) {

return HomeActivityState();

} ` view

`import 'package:fish_redux/fish_redux.dart'; import 'package:flutter/material.dart';

import 'action.dart'; import 'state.dart';

Widget buildView( HomeActivityState state, Dispatch dispatch, ViewService viewService) { return Container( child: InkWell( onTap: (){ print("sss"); dispatch(HomeActivityActionCreator.onAction()); }, child: Image.network( state.imageName, fit: BoxFit.cover, ), ), ); } `

connector

`import 'package:fish_redux/fish_redux.dart'; import 'package:rainbow_full/pages/home_page/components/home_activity_component/state.dart'; import 'package:rainbow_full/pages/home_page/state.dart';

class HomeActivityConnector extends ConnOp<HomePageState, HomeActivityState> { @override HomeActivityState get(HomePageState state) { HomeActivityState mstate = HomeActivityState();

return mstate;

} }`

'home_activity1': HomeActivityConnector() + HomeActivityComponent(),

然后我在 HomePage 中添加这个 component,通过 viewService.buildComponent('home_activity1'),

`class HomePage extends Page<HomePageState, Map<String, dynamic>> { HomePage() : super( initState: initState, effect: buildEffect(), reducer: buildReducer(), view: buildView, dependencies: Dependencies<HomePageState>( adapter: null, slots: <String, Dependent<HomePageState>>{ 'home_activity1': HomeActivityConnector() + HomeActivityComponent(),

          }),
      middleware: <Middleware<HomePageState>>[],
    );

} `

wangemng avatar Aug 27 '20 02:08 wangemng

微信 63289734

wangemng avatar Aug 27 '20 02:08 wangemng

以下我的 components action

` import 'package:fish_redux/fish_redux.dart';

//TODO replace with your own action enum HomeActivityAction { action }

class HomeActivityActionCreator { static Action onAction() { return const Action(HomeActivityAction.action); } }

` component

`import 'package:fish_redux/fish_redux.dart';

import 'effect.dart'; import 'reducer.dart'; import 'state.dart'; import 'view.dart';

class HomeActivityComponent extends Component { HomeActivityComponent() : super( effect: buildEffect(), reducer: buildReducer(), view: buildView, dependencies: Dependencies( adapter: null, slots: <String, Dependent>{ }),);

} `

effect

`import 'package:fish_redux/fish_redux.dart'; import 'action.dart'; import 'state.dart';

Effect buildEffect() { return combineEffects(<Object, Effect>{ // HomeActivityAction.action: _onAction, }); }

// void _onAction(Action action, Context ctx) { // } `

reducer

`import 'package:fish_redux/fish_redux.dart';

import 'action.dart'; import 'state.dart';

Reducer buildReducer() { return asReducer( <Object, Reducer>{ HomeActivityAction.action: _onAction, }, ); }

HomeActivityState _onAction(HomeActivityState state, Action action) { final HomeActivityState newState = state.clone(); print("object"); return newState; } ` state

`import 'package:fish_redux/fish_redux.dart';

class HomeActivityState implements Cloneable { String imageName; @override HomeActivityState clone() { return HomeActivityState()..imageName= imageName; } }

HomeActivityState initState(Map<String, dynamic> args) {

return HomeActivityState();

} ` view

`import 'package:fish_redux/fish_redux.dart'; import 'package:flutter/material.dart';

import 'action.dart'; import 'state.dart';

Widget buildView( HomeActivityState state, Dispatch dispatch, ViewService viewService) { return Container( child: InkWell( onTap: (){ print("sss"); dispatch(HomeActivityActionCreator.onAction()); }, child: Image.network( state.imageName, fit: BoxFit.cover, ), ), ); } `

connector

`import 'package:fish_redux/fish_redux.dart'; import 'package:rainbow_full/pages/home_page/components/home_activity_component/state.dart'; import 'package:rainbow_full/pages/home_page/state.dart';

class HomeActivityConnector extends ConnOp<HomePageState, HomeActivityState> { @override HomeActivityState get(HomePageState state) { HomeActivityState mstate = HomeActivityState();

return mstate;

} }`

'home_activity1': HomeActivityConnector() + HomeActivityComponent(),

然后我在 HomePage 中添加这个 component,通过 viewService.buildComponent('home_activity1'),

`class HomePage extends Page<HomePageState, Map<String, dynamic>> { HomePage() : super( initState: initState, effect: buildEffect(), reducer: buildReducer(), view: buildView, dependencies: Dependencies( adapter: null, slots: <String, Dependent>{ 'home_activity1': HomeActivityConnector() + HomeActivityComponent(),

          }),
      middleware: <Middleware<HomePageState>>[],
    );

} `

connector 需要实现 set方法,可以参考下#653

hfbi360 avatar Sep 01 '20 02:09 hfbi360

以下我的component action import'package:fish_redux / fish_redux.dart'; //将待办事项替换为您自己的动作 枚举HomeActivityAction {action} 类HomeActivityActionCreator { 静态Action onAction(){ 返回const Action(HomeActivityAction.action); } } 组件 import'package:fish_redux / fish_redux.dart'; 导入'effect.dart'; 导入'reducer.dart'; 导入'state.dart'; 导入'view.dart'; 类HomeActivityComponent扩展了组件{ HomeActivityComponent() :super( 效果:buildEffect(), reducer:buildReducer(), view:buildView, 依赖项:Dependencies( 适配器:null, 插槽:<String,Dependent> { }),); } 影响 import'package:fish_redux / fish_redux.dart'; 导入'action.dart'; 导入'state.dart'; 效果buildEffect(){ return CombineEffects(<Object,Effect> { // HomeActivityAction.action:_onAction, }); } // void _onAction(Action action,Context ctx){ //} 减速器 import'package:fish_redux / fish_redux.dart'; 导入'action.dart'; 导入'state.dart'; Reducer buildReducer(){ 返回asReducer( <Object,Reducer> { HomeActivityAction.action:_onAction, }, ); } HomeActivityState _onAction(HomeActivityState state,Action action){ final HomeActivityState newState = state.clone(); print(“ object”); 返回newState; } 状态 `import'package:fish_redux / fish_redux.dart'; HomeActivityState类实现Cloneable { String imageName; @override HomeActivityState clone(){ return HomeActivityState().. imageName = imageName; } } HomeActivityState initState(Map <String,dynamic> args){

return HomeActivityState();

} 视图import'package:fish_redux / fish_redux.dart'; 导入'package:flutter / material.dart'; 导入'action.dart'; 导入'state.dart'; 窗口小部件buildView( HomeActivityState状态,调度调度,ViewService viewService){ 返回容器( 子:墨水瓶( 中的onTap:(){ 打印( “SSS”); 调度(HomeActivityActionCreator.onAction()); }, 小孩:Image.network( 状态.imageName, 适合:BoxFit.cover, ), ), ); } 连接器import'package:fish_redux / fish_redux.dart'; 导入'package:rainbow_full / pages / home_page / components / home_activity_component / state.dart'; 导入'package:rainbow_full / pages / home_page / state.dart'; 类HomeActivityConnector扩展ConnOp <HomePageState,HomeActivityState> { @override HomeActivityState get(HomePageState state){ HomeActivityState mstate = HomeActivityState();

return mstate;

} } 'home_activity1': HomeActivityConnector() + HomeActivityComponent(),然后我在HomePage中添加这个组件,通过viewService.buildComponent('home_activity1'),Class HomePage扩展Page <HomePageState,Map <String,dynamic >> { HomePage() :super( initState:initState, effect:buildEffect(), reducer:buildReducer(), view:buildView, 依赖项:Dependencies( 适配器:null, 插槽:<String,Dependent> { 'home_activity1':HomeActivityConnector()+ HomeActivityComponent(),

          }),
      middleware: <Middleware<HomePageState>>[],
    );

} `

连接器需要实现set方法,可以参考下#653

能否给个示例代码 看一下 connector 看一下 我添加 set 方法也不对哦。。。是在 connector 中实现 set 方法吗? 把子组建要实现的值写在 set 方法中吗?

wangemng avatar Sep 07 '20 07:09 wangemng