Flutter 状态管理 flutter_Provide

项目的商品类别页面将大量的出现类和类中间的状态变化,这就须要状态管理。如今Flutter的状态管理方案不少,redux、bloc、state、Provide。git

  • Scoped Model : 最先的状态管理方案,我刚学Flutter的时候就使用的这个,虽然还有公司在用,可是大部分已经选用其它方案了。github

  • Redux:如今国内用的最多,由于咸鱼团队一直在用,还出了本身fish reduxredux

  • bloc:我的觉的比Redux简单,并且好用,特别是一个页面里的状态管理,用起来很爽。less

  • state:咱们首页里已经简单接触,缺点是耦合太强,若是是大型应用,管理起来很是混乱。ide

  • Provide:是在Google的Github下的一个项目,刚出现不久,因此能够推测他是Google的亲儿子,用起来也是至关的爽。字体

因此我的觉的Flutter_provide是目前最好的状态管理方案,那咱们就采用这种方案来制做项目。ui

flutter_Provide简介

Provide是Google官方推出的状态管理模式。官方地址为:https://github.com/google/flutter-providegoogle

我的看来Provide被设计为ScopedModel的代替品,而且容许咱们更加灵活地处理数据类型和数据。spa

首先添加依赖

provide: ^1.0.2

使用Provide

下面就简单用flutter_provide进行一个简单的小实例,例子是这样的,咱们在一个页面上增长了Text和一个RaisedButton.而且故意使用了StatelessWidget做了两个类。也就是估计做了一个不可变的页面,而且用两个类隔离了。而后咱们要点击按钮,增长数字数量,也就是把状态打通。设计

制做最基本的页面

快速写一个最基本的页面,而且所有使用了StatelessWidget进行。

import 'package:flutter/material.dart';

class CartPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body:Center(
        child: Column(
         children: <Widget>[
           Number(),
           MyButton()
         ],
        ),
      )
    );
  }
}

class Number extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.only(top:200),
      child:Text('0')
    );
  }
}

class MyButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child:RaisedButton(
        onPressed: (){},
        child: Text('递增'),
      )
    );
  }
}

建立Provide

这个相似于建立一个state,可是为了跟State区分,咱们建立Provide。新建一个provide文件夹,而后再里边新建一个counter.dart 文件.代码以下:

import 'package:flutter/material.dart';

class Counter with ChangeNotifier{ //不用管理听众
  int value = 0;
  increment(){
    value++;
    notifyListeners(); //变化后通知听众,局部刷新Widget
  } 

}

这里混入了ChangeNotifier,意思是能够不用管理听众。如今你能够看到数和操做数据的方法都在Provide中,很清晰的把业务分离出来了。经过notifyListeners能够通知听众刷新。

将状态放入顶层

修改main.dart文件,先引入providecounter

import 'package:provide/provide.dart';
import './provide/counter.dart';

而后进行将providecounter引入程序顶层。

void main(){
  var counter =Counter();
  var providers  =Providers();
  providers
    ..provide(Provider<Counter>.value(counter));
    //..可多个状态, ;在最后
  runApp(ProviderNode(child:MyApp(),providers:providers));
}

ProviderNode封装了InheritWidget,而且提供了 一个providers容器用于放置状态。

获取状态

使用Provide Widget的形式就能够获取状态,好比如今获取数字的状态,代码以下。

class Number extends StatelessWidget {
 
  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.only(top:200),
      child: Provide<Counter>( //获取状态值
        builder: (context,child,counter){
          return Text(
            '${counter.value}',
             style: Theme.of(context).textTheme.display1, //大字体
          );
        },
      ),
    );
  }
}

修改状态

直接编写按钮的单击事件,并调用provide里的方法,代码修改以下。

class MyButton extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Container(
      child:RaisedButton(
        onPressed: (){ //修改状态
          Provide.value<Counter>(context).increment();
        },
        child: Text('递增'),
      )
    );
  }
}

其它页面读取状态

为了更进一步说明状态是共享的,在“会员中心”页面,咱们也显示出这个数字,代码以下:

import 'package:flutter/material.dart';
import 'package:provide/provide.dart';
import '../provide/counter.dart';

class MemberPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body:Center(
        child: Provide<Counter>(
        builder: (context,child,counter){
          return Text(
            '${counter.value}',
             style: Theme.of(context).textTheme.display1,
          );
        },
      ),
      )
    );
  }
}

总结:经过本节终结,能够掌握flutter_provide的使用方法,并做了一个最简单的案例。若是你之前使用过其它状态管理方案,你就会知道provide到底有多爽了。因此建议小伙伴使用Provide来进行管理状态。

相关文章
相关标签/搜索