美文网首页
Flutter初识状态管理

Flutter初识状态管理

作者: IsYang | 来源:发表于2019-11-04 11:10 被阅读0次

    Flutter中,管理状态的最常见的方法:

    • Widget管理自身的状态
    • 父Widget管理子Widget的状态
    • 混合状态(父Widget和子Widget都管理状态)

    1. Widget管理自身的状态

    在自身Widget中更新视图。

    在SelfPage类中,定义一个_active变量,定义一个_handleTap()点击事件函数,在调用该函数时更新_active变量的值,并调用setState()来更新视图;

    代码示例如下:

    class SelfPage extends StatefulWidget {
    
      @override
      _SelfPageState createState() => new _SelfPageState();
    }
    
    class _SelfPageState extends State<SelfPage> {
      bool _active = false;
    
      void _handleTap() {
        setState(() {
          _active = !_active;
        });
      }
    
      Widget build(BuildContext context) {
        return new GestureDetector(
          onTap: _handleTap,
          child: new Container(
            child: new Center(
              child: new Text(
                _active ? 'Active' : 'Inactive',
                style: new TextStyle(fontSize: 32.0, color: Colors.white),
              ),
            ),
            width: 200.0,
            height: 200.0
          ),
        );
      }
    }
    

    2. 父Widget管理子Widget的状态

    在父Widget中,通知其子Widget更新视图。

    在ParentPage类中,定义一个_active变量,用于赋值给子类,定义一个当状态发生变化时_handleChangeTap()函数,调用setState()来更新子类的视图;

    在ChildPage 子类中,定义所需接收的参数值,active(变量),onChanged(事件)

    代码示例如下:

    class ParentStatePage extends StatefulWidget {
      @override
      _ParentStatePageState createState() => new _ParentStatePageState();
    }
    
    class _ParentStatePageState extends State<ParentStatePage> {
      bool _active = false;
    
      void _handleTapboxChanged(bool newValue) {
        setState(() {
          _active = newValue;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return new Container(
          child: new ChildPage(
            active: _active,
            onChanged: _handleTapboxChanged,
          ),
        );
      }
    }
    
    class ChildPage extends StatelessWidget {
      ChildPage({Key key, this.active: false, @required this.onChanged})
          : super(key: key);
    
      final bool active;
      final ValueChanged<bool> onChanged;
    
      void _handleTap() {
        onChanged(!active);
      }
    
      Widget build(BuildContext context) {
        return new GestureDetector(
          onTap: () {
            _handleTap();
          },
          child: new Container(
            child: new Center(
              child: new Text(
                active ? 'Active' : 'Inactive',
                style: new TextStyle(fontSize: 32.0, color: Colors.white),
              ),
            ),
            width: 200.0,
            height: 200.0
          ),
        );
      }
    }
    

    3. 混合状态(父Widget和子Widget都管理状态)

    可以通过父Widget来通知其子Widget更新视图,也可以子Widget自己来更新视图。

    在2示例代码中,在原来的代码基础上,对子Widget类增加一个处理按下事件的函数,去更新视图
    代码示例如下:

    class ParentPage extends StatefulWidget {
      @override
      _ParentPageState createState() => new _ParentPageState();
    }
    
    class _ParentPageState extends State<ParentPage> {
      bool _active = false;
    
      void _handleTapboxChanged(bool newValue) {
        setState(() {
          _active = newValue;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return new Container(
          child: new TapboxC(
            active: _active,
            onChanged: _handleTapboxChanged,
          ),
        );
      }
    }
    
    class ChildPage extends StatefulWidget {
      ChildPage({Key key, this.active: false, @required this.onChanged})
          : super(key: key);
    
      final bool active;
      final ValueChanged<bool> onChanged;
      bool _highlight = false;
    
      void _handleTapDown(TapDownDetails details) {
        setState(() {
          _highlight = true;
        });
      }
    
      void _handleTap() {
        onChanged(!active);
      }
    
      Widget build(BuildContext context) {
        return new GestureDetector(
         // 处理按下事件时
         onTapDown: () {
            _handleTapDown(); 
          }, 
          onTap: () {
            _handleTap();
          }, 
          child: new Container(
            child: new Center(
              child: new Text(
                active ? 'Active' : 'Inactive',
                style: new TextStyle(fontSize: 32.0, color: Colors.white),
              ),
            ),
            width: 200.0,
            height: 200.0,
            decoration: new BoxDecoration(
              color: _highlight ? Colors.lightGreen[700] : Colors.grey[600],
            ),
          ),
        );
      }
    }
    

    当应用中需要一些跨组件管理状态时,就需要全局状态管理了,可以使用一些专门用于状态管理的包,如Provider、Redux,读者可以在pub上查看其详细信息。

    相关文章

      网友评论

          本文标题:Flutter初识状态管理

          本文链接:https://www.haomeiwen.com/subject/gugfbctx.html