Flutter状态管理-04-Provider

311 阅读1分钟

Provider 是Google推荐的状态管理工具之一 pub官网:pub.dev/packages/pr…

添加依赖
dependencies:
  provider: ^4.3.2+1

然后 :flutter pub get

使用时几个重要的点
  • 定义一个类,让其with ChangeNotifier,在该类内是业务数据,和对业务数据进行的操作。
  • MutiProvider 要成为根节点,也就是放到runApp内。并且要把自定义的类放到Multiprovider内。
  • 在widget内操作数据时,context.read().xxx(); xxx代表业务方法
  • 在widget内读取数据时,context.watch().data; data代表业务数据 这样,就把业务类,数据读取和数据操作完全分离开了。
示例

还是以加数字为例

  • 定义业务逻辑类Counter
class Counter with ChangeNotifier,DiagnosticableTreeMixin{
  int _count = 0;
  int get count => _count;
  increment(){
    _count++;
    notifyListeners();
  }
  @override
  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
    // TODO: implement debugFillProperties
    super.debugFillProperties(properties);
    properties.add(IntProperty("count",count));
  }
}

_count:代表业务数据 int get count => _count: 代表对业务数据的访问 increment(): 代表对业务数据的操作

  • 将Provider整体注册到根节点,并将自定义的业务数据类Counter放到根节点下
void main() {
  runApp(MultiProvider(
    providers: [
      ChangeNotifierProvider(create: (_)=>Counter(),)
    ],
    child: MyApp(),
  ));
}
  • 在widget中读取业务数据,context.watch().count.toString();
class CountWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var str = context.watch<Counter>().count.toString();
    return Text(
      str
    );
  }
  • 在widget中操作业务数据, context.read().increment();
 floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: (){
          context.read<Counter>().increment();
        },
      )
完整代码
  • main.dart
void main() {
  runApp(MultiProvider(
    providers: [
      ChangeNotifierProvider(create: (_)=>Counter(),)
    ],
    child: MyApp(),
  ));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
//      home: MyHomePage(title: 'Flutter Demo Home Page'),
      home: ProviderTest(),
    );
  }
}
  • provider_test.dart
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ProviderTest extends StatefulWidget {
  @override
  _ProviderTestState createState() => _ProviderTestState();
}

class _ProviderTestState extends State<ProviderTest> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Provider"),
      ),
      body: Center(
        child: CountWidget(),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: (){
          context.read<Counter>().increment();
        },
      )
    );
  }
}


class Counter with ChangeNotifier,DiagnosticableTreeMixin{
  int _count = 0;
  int get count => _count;
  increment(){
    _count++;
    notifyListeners();
  }
  @override
  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
    // TODO: implement debugFillProperties
    super.debugFillProperties(properties);
    properties.add(IntProperty("count",count));
  }
}

class CountWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var str = context.watch<Counter>().count.toString();
    return Text(
      str
    );
  }
}