上一篇文章,我们介绍了如何在flutter中使用redux。在上一篇文章的例子中,我们使用了单界面集成redux,但是在实际项目中,我们通常涉及多个模块,每个模块涉及多个界面,那么如何使用redux整合模块,并实现模块和界面间的消息传递呢?

例子:登录

接着上篇文章,这次的例子稍微复杂一点:

目标:

  • 实现登录界面,实现基本登录逻辑
  • 成功之后将结果通知到其他界面

先将AppState等状态有关的移动到reducers.dart,创建LoginPage.dart

LoginPage.dart代码如下:

import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:flutter_use_redux/reducers.dart';
import 'package:redux/redux.dart';
import 'dart:async';
import 'package:flutter/cupertino.dart'; typedef Future CallLogin(String account,String pwd); class LoginPageState extends State<LoginPage>{ String _account;
String _pwd; bool isLogin; @override
void initState() {
super.initState();
} @override
void dispose() {
super.dispose();
} @override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("登录"),
),
body: new Form(
onChanged: (){
print("changed");
},
onWillPop: () async{
return true;
},
child: new Padding(padding: new EdgeInsets.all(10.0),child: new Column( children: <Widget>[
new TextFormField( decoration:new InputDecoration(labelText: "请输入账号") ,
onSaved: (String value){
_account = value;
}, ///保持一下输入的账号
validator: (String value)=> value.isEmpty ? "请输入账号" : null, ),
new TextFormField(decoration:new InputDecoration(labelText: "请输入密码"),
onSaved: (String value)=>_pwd = value, ///保持一下输入的密码
validator: (String value)=> value.isEmpty ? "请输入密码" : null),
new FormField(builder: (FormFieldState s){
return new Center(
child: new RaisedButton(onPressed: () async{ FormState state = Form.of(s.context);
if(state.validate()){
//如果验证成功,那么执行登录逻辑
state.save();
print("Login success $_account" );
//这里交给设置好的逻辑去执行操作
try{
await widget.callLogin(_account,_pwd);
showDialog(context: context,builder: (c){ return new CupertinoAlertDialog(
title: new Text("登录成功"),
actions: <Widget>[
new Center(
child: new RaisedButton(
onPressed:(){
Navigator.of(context).pop();
Navigator.of(context).pop();
},
child: new Text("ok"),
)
)
],
); });
// Navigator.of(context).pop();
}catch(e){
showDialog(context: context,builder: (c){ return new CupertinoAlertDialog(
title: new Text("登录失败$e"),
actions: <Widget>[
new Center(
child: new RaisedButton(
onPressed:(){
Navigator.of(context).pop();
},
child: new Text("ok"),
)
)
],
); });
///登录失败,提示一下用户
print("登录失败! $e");
} } },child: new Text("提交"),)
);
})
], ),)),
);
} } class LoginPage extends StatefulWidget{ CallLogin callLogin; LoginPage({this.callLogin}); @override
State<StatefulWidget> createState() {
return new LoginPageState();
} }

注意:这个组件其实并没有使用redux,登录逻辑使用外部传递过来的函数来处理:

 CallLogin callLogin;
LoginPage({this.callLogin}); ...
//执行登录逻辑
await widget.callLogin(_account,_pwd);
...

为什么要这么做呢?好处有哪些?

  • 减少组件之间的依赖关系
  • 减少本类的职责,将本类的职责变成只展示ui
  • 本类可单独单元测试,单独工作,只要传进来一个模拟的逻辑函数

那么在哪里将登录逻辑传递进来呢?

···
routes: {

    "login":(BuildContext context)=>new StoreConnector(builder: ( BuildContext context,Store<AppState> store ){

      return new LoginPage(callLogin: (String account,String pwd) async{
print("正在登录,账号$account,密码:$pwd");
// 为了模拟实际登录,这里等待一秒
await new Async.Future.delayed(new Duration(milliseconds: 1000));
if(pwd != "123456"){
throw ("登录失败,密码必须是123456");
}
print("登录成功!");
store.dispatch(new LoginSuccessAction(account: account)); },);
}, converter: (Store<AppState> store){
return store;
}),

···

在导入这个登录组件到应用程序路由上面的时候,这个时候将逻辑和Store进行对接,这样做,就将逻辑和ui彻底的分开了。

这里涉及到异步操作,那么就会遇到所谓“副作用”问题。
随着项目的增大,reducer也会越来越大,那么有什么办法可以管理呢?
这些问题我们改天再分享。

附件:

老规矩,代码在这里:
https://github.com/jzoom/flut...

如有疑问,请加qq群854192563讨论

flutter中使用redux之多界面互动的更多相关文章

  1. 理解 Flutter 中的 Key

    概览 在 Flutter 中,大概大家都知道如何更新界面视图: 通过修改 Stata 去触发 Widget 重建,触发和更新的操作是 Flutter 框架做的. 但是有时即使修改了 State,Flu ...

  2. 在React中使用Redux

    这是Webpack+React系列配置过程记录的第六篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...

  3. 在Flutter中嵌入Native组件的正确姿势是...

    引言 在漫长的从Native向Flutter过渡的混合工程时期,要想平滑地过渡,在Flutter中使用Native中较为完善的控件会是一个很好的选择.本文希望向大家介绍AndroidView的使用方式 ...

  4. mvp 在 flutter 中的应用

    在 Android 应用程序开发过程中,我们经常会用到一些所谓的架构方法,如:mvp,mvvm,clean等.之所以这些方法会被推崇是因为他们可以大大的解耦我们的代码的功能模块,让我们的代码在项目中后 ...

  5. Flutter 中文文档网站 flutter.cn 正式发布!

    在通常的对 Flutter 介绍中,最耳熟能详的是下面四个特点: 精美 (Beautiful):充分的赋予和发挥设计师的创造力和想象力,让你真正掌控屏幕上的每一个像素. ** 极速 (Fast)**: ...

  6. Flutter中管理路由栈的方法和应用

    原文地址:https://www.jianshu.com/p/5df089d360e4 本文首先讲的Flutter中的路由,然后主要讲下Flutter中栈管理的几种方法. 了解下Route和Navig ...

  7. 在Flutter中构建布局

    这是在Flutter中构建布局的指南.首先,您将构建以下屏幕截图的布局.然后回过头, 本指南将解释Flutter的布局方法,并说明如何在屏幕上放置一个widget.在讨论如何水平和垂直放置widget ...

  8. flutter中的生命周期函数

    前言:生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的时机做该做的事情,flutter中的State生命周期和android以及React Native的生命周期类似. 先看一张 ...

  9. flutter 中的AppBar

    在flutter中的很多页面中,都会有下面这段代码: 对应就是下图中的红色线框区域,被称作AppBar顶部导航. 项目准备 在使用AppBar之前,我们先新建一个tabBar的项目: 然后在pages ...

随机推荐

  1. LinkedHashMap 与 HashMap 实现的区别

    阅读前最好对 HashMap 的内部实现方式有一定了解 LinkedHashMap 继承自 HashMap 主要重写了一个节点类 LinkedHashMap.Entry,并维护一个头结点和尾节点 以及 ...

  2. HSRP热备份路由协议

    HSRP热备份路由协议 案例1:HSRP配置 案例2:三层交换配置HSRP 案例3:STP的配置 案例4:三层交换配置STP 1 案例1:HSRP配置 1.1 问题 在企业网络到外部的连接方案中,要求 ...

  3. 真没想到,Springboot能这样做全局日期格式化,有点香!

    最近面了一些公司,有一些 Java方面的架构.面试资料,有需要的小伙伴可以在公众号[程序员内点事]里,无套路自行领取 说在前边 最近部门几位同事受了一些委屈相继离职,共事三年临别之际颇有不舍,待一切手 ...

  4. 使用 python 查看谁没有交作业

    话说实验报告每天都要查人数,何不用程序实现 使用 python 查看谁没有交作业 version 1.0 程序嘛,肯定是可以改进的.使用该程序的前提是实验报告文件名中包含学号信息.将以上程序放在实验报 ...

  5. 100 Path Sum

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  6. 【Selenium02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第二篇博 ...

  7. python简易的大乐透数据获取及初步分析

    该项目从网上爬取并分析彩票数据,为用户查看和初步分析往期数据提供一种简易的工具. https://github.com/unknowcry/Lottery # -*- coding: utf-8 -* ...

  8. 造轮子:实现一个简易的 Spring IoC 容器

    作者:DeppWang.原文地址 我通过实现一个简易的 Spring IoC 容器,算是入门了 Spring 框架.本文是对实现过程的一个总结提炼,需要配合源码阅读,源码地址. 结合本文和源码,你应该 ...

  9. JVM 调优之 Eclipse 启动调优实战

    本文是我12年在学习<深入理解Java虚拟机:JVM高级特性与最佳实践>时,做的一个 JVM 简单调优实战笔记,版本都有些过时,不过调优思路和过程还是可以分享给大家参考的. 环境基础配置 ...

  10. python高级特性之封包与解包

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:kwsy PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...