Flutter 入门 - 状态管理

Dart4Flutter - 01 – 变量、类型和函数react

Dart4Flutter – 02 –控制流 和异常git

Dart4Flutter – 03 – 类和泛型github

Dart4Flutter – 04 – 异步和库redux

Dart4Flutter - 拾遗01 - flutter-dart环境搭建app

Dart4Flutter - 不可变性框架

Flutter入门 - 状态管理less

Flutter 入门实例1异步

Flutter 入门 - Container 属性详解ide

Flutter 入门-本地访问-MethodChannel函数

Flutter 实例 - 加载更多的ListView

Flutter 实例 - 从本地到Flutter通讯 - Event Channels

flutter是一个新的跨平台框架,使用Dart语言开发。转移到新的平台,其中有一个问题:状态管理。

  • 怎样将状态沿着组件向下传递
  • 状态改变,怎么样刷新UI
  • 怎样在不一样界面跳转以及状态同步

开始

由于咱们要演示在不一样的界面跳转,因此如今咱们建立两个文件MyHomePage.dartMySecondPage.dart .

咱们例子具体以下:

  • 在MyHomePage增长counter的值
  • 跳转到MySecondPage。
  • 在MySecondPage界面减小counter的值。

看起来彷佛很简单,可是咱们要找到一个方法,可使counter在两个界面之间同步。

假设如今counter=0;当咱们在MyHomePage将counter增长到2,而后跳转到MySecondPage界面,显示的counter也必须是2.

同时,假设咱们在MySecondPage界面递减两次counter,这时当用户跳转到MyHomePage,counter也应该是0。

这就是状态管理。

假设您已经知道setState()机制,用来更新UI的机制。如今咱们看看具体怎么作。

main.dart 以下:

import 'package:flutter/material.dart';
import 'package:flutter_redux_example/screens/MyHomePage.dart';
void main() => runApp(new MyApp());
class MyApp extends StatefulWidget {
  
  @override
  _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 以下:

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 文件以下所示:

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,上面的内容比较容易理解。

flutter中的StatefulWidgetStatelessWidget对应react中的ComponentPureComponent。flutter中称为Widget的,react称为Component

参考

相关文章
相关标签/搜索