(译) Google Flutter 中的简单状态管理

原文链接

我是如何遇见 Google Flutter的

这对我来这是像往常一样的码代码的一天。我的一个朋友在我们的开发者群组中发了这么一个问题,是否有人尝试过Google Flutter。它想要知道React Native 和 Google Flutter之间的比较。这个问题让我种草了Google Flutter。我之前从没有听过Google Flutter。它是否值得与React Native进行比较,就像AngularJS相较于ReactJS?

我必须承认。我是一个React的迷弟。我已经使用ReactJS差不多两年了。我也写React Natice。但是不要对我有所误解。我之前也曾为AngularJS疯狂。有大约一年的时间我是一个AngularJS的开发者。然后我换了一家使用ReactJS的新公司。后来的事你们都知道了。

##长话短说 我渴望尝试使用Flutter

Google Flutter是一个新的平台,在这个平台之上你可以用一份Dart代码同时开发Android和iOS应用。迁移到新的开发栈之后,我知道做一个简单的应用,至少要优先处理的是状态管理。它把我引向了三个问题:

1.如何在widget树种向下传递一个应用的状态

2.如何在更新应用的状态之后对widget进行重建

3.如何在在页面之间跳转的同时保持状态同步。

执行

默认情况下,flutter会创建main.dart。这是进程运行的地方。由于我要创建两个页面直接的跳转,我额外创建了两个文档:MyHomePage.dart以及MySecondPage.dart。

这个应用进程的目的是让用户做以下几件事:

  • 使MyHomePage中的计数器自增
  • 跳转到MySecondPage
  • 使MySecondPage中的计数器递减

这虽然看起来很简单,但是我要找到一种方式保持MyHomePage和MySecondPage之间计数器的同步。

计数器的初始值是0。如果在MyHomePage中用户自增了两次,当用户跳转到MySecondPage之后,计数器必须展示位2。

与此同时,如果在MySecondPage中用户自减了两次,当用户跳转到MyHomePage,计数器必须展示为0。

这叫做状态管理。

我得知Google Flutter有着setState()的机制,而这个机制React也有。这使我能更快地找出解决方案。

在我的main.dart文档中:

1234567891011121314151617181920212223242526272829303132333435363738394041424344
import ‘package:flutter/material.dart‘;import ‘package:flutter_redux_example/screens/MyHomePage.dart‘;void main() => runApp(new MyApp());class  extends StatefulWidget {

_MyAppState createState() => new _MyAppState();}class _MyAppState extends State<MyApp> {  int counter;  @override  void initState() {    super.initState();    counter = counter ?? 0;  }  void _decrementCounter(_) {    setState(() {      counter--;      print(‘decrement: $counter‘);    });  }

void _incrementCounter(_) {    setState(() {      counter++;      print(‘increment: $counter‘);    });  }  @override  Widget build(BuildContext context) {    return new MaterialApp(      title: ‘Flutter Demo‘,      theme: new ThemeData(        primarySwatch: Colors.blue,      ),      home: new MyHomePage(        title: ‘My Home Page‘,        counter: counter,        decrementCounter: _decrementCounter,        incrementCounter: _incrementCounter,      ),    );  }}

从以上的代码,你可以看到_decrementCounter()和_incrementCounter()。它们是负责操作counter的值的,然后我把它们传递给了MyHomePage的构造器。

在我的MyHomePage.dart文档中:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
import ‘package:flutter/material.dart‘;import ‘package:flutter_redux_example/screens/MySecondPage.dart‘;class MyHomePage extends StatefulWidget {  MyHomePage({    Key key,    this.title,    this.counter,    this.decrementCounter,    this.incrementCounter  }) : super(key: key);  final String title;  final int counter;  final ValueChanged<void> decrementCounter;  final ValueChanged<void> incrementCounter;  @override  _MyHomePageState createState() => new _MyHomePageState();}class _MyHomePageState extends State<MyHomePage> {  void _onPressed() {    widget.incrementCounter(null);  }  @override  Widget build(BuildContext context) {    return new Scaffold(      appBar: new AppBar(        title: new Text(widget.title),      ),      body: new Center(        child: new Column(          mainAxisAlignment: MainAxisAlignment.center,          children: <Widget>[            new Text(‘You have pushed the button this many times:‘),            new Text(              widget.counter.toString(),              style: Theme.of(context).textTheme.display1,            ),            new RaisedButton(              child: new Text(‘Next Screen‘),              onPressed: () {                Navigator.push(                  context,                  new MaterialPageRoute(                    builder: (context) => new MySecondPage(                      widget.decrementCounter,                      title: ‘My Second Page‘,                      counter: widget.counter,                    ),                  ),                );              },            )          ],        ),      ),      floatingActionButton: new FloatingActionButton(        onPressed: _onPressed,        tooltip: ‘Increment‘,        child: new Icon(Icons.add),      ),    );  }}

从上述代码,你可以看到我把decrementCounter()向下传递给了MySecondPage的构造器。

在我的MySecondPage.dart文档中:

12345678910111213141516171819202122232425262728293031323334353637383940414243
import ‘package:flutter/material.dart‘;

class MySecondPage extends StatefulWidget {  MySecondPage(    this.decrementCounter,     {Key key, this.title, this.counter}  ): super(key: key);  final String title;  final int counter;  final ValueChanged<void> decrementCounter;  @override  _MySecondPageState createState() => new _MySecondPageState();}class _MySecondPageState extends State<MySecondPage> {  void onPressed() {    widget.decrementCounter(null);  }  @override  Widget build(BuildContext context) {    return new Scaffold(      appBar: new AppBar(        title: new Text(widget.title),      ),      body: new Center(        child: new Column(          mainAxisAlignment: MainAxisAlignment.center,          children: <Widget>[            new Text(‘You have pushed the button this many times :‘),            new Text(              super.widget.counter.toString(),              style: Theme.of(context).textTheme.display1,            ),          ],        ),      ),    floatingActionButton: new FloatingActionButton(      onPressed: onPressed,      tooltip: ‘Decrement‘,      child: new Icon(Icons.indeterminate_check_box),      backgroundColor: Colors.red),    );  }}

结论

对于有着React背景的的开发者来说,玩弄Google Flutter中的基础状态管理不是已经特别难得事情。方法看起来很类似:存在一个setState()机制来对视图进行更新。StatefulWidget以及StatelessWidget的概念,对于我来说就行Component和PureComponent。Flutter把它们叫做Widget而React把它叫做Component。

那么,基本上,主要的问题就是 Google Flutter 所使用的编程语言了。由于它使用了Dart,我适应了Dart所拥有的语法和范式。目前为止,不是特别困难。对于我来说,Dart就像Java和Javascript生了一个孩子。

在这篇文章中,我设法解决我之前提及到的三个问题:

1.如何在widget树种向下传递一个应用的状态 /通过

2.如何在更新应用的状态之后对widget进行重建 /通过

3.如何在在页面之间跳转的同时保持状态同步。/通过

记住,这只是一个很简单的应用。在大型应用上事情会变得复杂很多。想象你要在应用所有widget中向下传递变量。这会是一件令人苦恼的事情。

在React环境下,我使用Redux来管理应用状态。我得知Redux也适用于Google Flutter。事实上,我已经成功地在Google Flutter应用上实现了Redux。让我们拭目以待我是否能发布关于此内容的文章。

原文:大专栏  (译) Google Flutter 中的简单状态管理

原文地址:https://www.cnblogs.com/petewell/p/11445324.html

时间: 2024-10-07 12:12:13

(译) Google Flutter 中的简单状态管理的相关文章

React项目中使用Mobx状态管理(二)

并上一节使用的是普通的数据状态管理,不过官方推荐使用装饰器模式,而在默认的react项目中是不支持装饰器的,需要手动启用. 官方参考 一.添加配置 官方提供了四种方法, 方法一.使用TypeScript,顾名思义该方法是项目使用typescript时的配置 方法二.使用babel-preset-mobx, 安装并添加到.babelrc配置中,该方法需要升级一些依赖, babel-core -> @/babel-core 7.x babel-loader -> @/babel-loader 8.

C++中的简单内存管理---初步认识

OC里面给变量赋值有2种方法第一种是直接用下划线的,也就是实例变量:_button=       第二种是使用属性:self.button = ....这两种有何区别??? 以下项目是创建了一个C++项目   简单模拟创建对象和给变量赋值的情况 首先创建了一个NSObject类,在OC里面继承NSObject类的都有retain  release  autorelease....等方法来管理内存的 NSObject的头文件,声明方法 // // NSObject.h // autorelease

flutter中修改键盘状态

当用户进行表格输入时,为更方便的方便用户操作,我们需要设置键盘状态方便用户点击,如当表格填写完成时,用户可以直接点击键盘下面的"完成"状态完成提交. 实现如下: TextFormField( ... textInputAction: TextInputAction.next,//设置跳到下一个选项 ... ) 效果: 同理设置"完成"状态: TextFormField( ... textInputAction: TextInputAction.done, ... )

react项目的中使用mobx状态管理安装ES7装饰器(Decorator)语法教程

那么如何实现装饰器的使用呢? 1.在命令行工具中使用 npm run eject.不熟的情况下可能会报错,如果报错的信息大概意思是:有些文件未被追踪到,那么直接git add . 再 git commit -m "",或者直接在.gitignore中忽略这些文件(不建议)2.npm run eject之后package.json中会出现很多依赖建议yarn/npm i 一下.3.然后打开package.json文件,找到“babel”开头的一个对象,(一般在最后,),这是原始的样子:

Flutter 中SimpleDialog简单弹窗使用

import 'package:flutter/material.dart'; import 'dart:async'; enum Option { A, B, C } class SimpleDialogDemo extends StatefulWidget { @override _SimpleDialogDemoState createState() => _SimpleDialogDemoState(); } class _SimpleDialogDemoState extends St

SERVLETJSP学习(六)—— 状态管理-cookie

1. 状态管理-Cookie 1.1. 状态管理 1.1.1. 为什么需要状态管理 Web应用程序使用HTTP协议作为传输数据的标准协议,而HTTP协议是无状态协议,即一次请求对应一次响应,响应结束后连接即断开,同一个用户的不同请求对于服务器端来讲并不会认为这两个请求有什么关联性,并不会以此区分不同的客户端.但实际情况中还是需要服务器端能够区分不同的客户端以及记录与客户端相关的一些数据,所以状态管理能够做到不同客户端的身份识别. 1.1.2. 什么是状态管理 将客户端与服务器之间多次交互当做一个

HttpClient4.3教程 第三章 Http状态管理

HttpClient4.3教程 第三章 Http状态管理 Posted on 2013 年 10 月 13 日 最初,Http被设计成一个无状态的,面向请求/响应的协议,所以它不能在逻辑相关的http请求/响应中保持状态会话.由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统,比如电子商务系统.因此,http支持状态管理就很必要了. 当时的web客户端和服务器软件领先者,网景(netscape)公司,最先在他们的产品中支持http状态管理,并且制定了一些专有规范.后来,网景

Vue 状态管理

类flux状态管理的官方实现 由于多个状态分散的跨越在许多组件和交互间的各个角落,大型应用复杂度也经常逐渐增长. 为了解决这个问题,vue提供了vuex:我们有收到elm启发的状态管理库,vuex甚至集成到vue-detools.无须配置即可访问时光旅行. 简单状态管理起步使用 经常被忽略的是,Vue应用中原始数据对象的实际来源-当访问数据对象时,一个vue实例只是简单的代理访问.所以,如果你有一处需要被多个实例间共享的状态,可以简单的通过维护一份数据来实现共享: const sourceOfT

Flutter 中的路由

Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航. 并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.pop Flutter 中给我们提供了两种配置路由跳转的方式:1.基本路由 2.命名路由 Flutter 中的基本路由使用 例如: 从 HomePage 组件跳转到 SearchPage 组件 1.需要在 HomPage 中引入 SearchPage.dart import '../SearchPage