`
ipython
  • 浏览: 294503 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

flutter provider 5.0 状态管理学习

阅读更多

Flutter Provider 5.0 学习

 

下面是修改过的provider 官方例子代码:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'dart:math';

void main() {
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => Counter()),
        ChangeNotifierProvider(create: (_) => Person()),
      ],
      child: const MyApp(),
    ),
  );
}

class Counter with ChangeNotifier {
  int _count = 0;
  int get count => _count;
  String _name = 'Michael';
  String get name => _name;

  void increment() {
    _count++;
    notifyListeners();
  }

  void setName (int i) {
    _name = '$name $i';
    notifyListeners ();
  }
}

class Person with ChangeNotifier {
  int _age = 18;
  int get age => _age;
  String _name = '1';
  String get name => _name;

  void changeName () {
    var r = Random();
    _name = 'Student: ${r.nextInt(100)}';
    notifyListeners();
  }
  void changeAge () {
    var r = Random();
    _age  = r.nextInt(100);
    notifyListeners();
  }
}

class MyApp extends StatelessWidget {
  const MyApp({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    print ('build home page');
    return Scaffold(
      appBar: AppBar(
        title: const Text('Provider 5.0 Example'),
      ),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          mainAxisAlignment: MainAxisAlignment.center,
          children: const <Widget>[
            Text('You have pushed the button this many times:'),
            Count(),
            ShowName(),
            ShowAge(),
            ShowPersonName(),
            ShowPersonName2(),
            ShowPersonAge (),
            ShowPersonAge2(),
            ChangePersonName(),
            ChangePersonAge (),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        key: const Key('increment_floatingActionButton'),
        onPressed: () => context.read<Counter>().increment(),
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

class Count extends StatelessWidget {
  const Count({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Text(
        '${context.watch<Counter>().count}',
        key: const Key('counterState'),
        style: Theme.of(context).textTheme.headline4);
  }
}

class ShowName extends StatelessWidget {
  const ShowName({Key key}) : super(key:key);
  @override
  Widget build(BuildContext context) {
    print ('show name');
    return Text(
      '${context.watch<Counter>().name}',
    );
  }
}

class ShowAge extends StatelessWidget {
    const ShowAge ({Key key}):super(key:key);
    @override
    Widget build (BuildContext context) {
        print ('show age');
        return new Center(
            child: new Text('show Age', style: new TextStyle(fontSize: 32.0))
        );
    }
}

class ShowPersonName extends StatelessWidget {
    const ShowPersonName ({Key key}):super(key:key);
    @override
    Widget build (BuildContext context) {
        print ('show person name');
        final personName = context.select((Person p) => p.name ); // 采用select 方式,绑定Person的name属性,只有name属性的值改变了,才刷新本widget
        return new Center(
            child: new Text('Person Name: ${personName}', style: new TextStyle(fontSize: 32.0))
        );
    }
}

class ShowPersonAge extends StatelessWidget {
    const ShowPersonAge ({Key key}):super(key:key);
    @override
    Widget build (BuildContext context) {
        print ('show person age');
        final personAge = context.select((Person p)=>p.age);  // 采用select 方式,绑定Person的age属性,只有age属性的值改变了,才刷新本widget, 推荐这用法
        return new Center(
            child: new Text('Person Age: ${personAge}', style: new TextStyle(fontSize: 32.0))
        );
    }
}

class ShowPersonName2 extends StatelessWidget {
    const ShowPersonName2 ({Key key}):super(key:key);
    @override
    Widget build (BuildContext context) {
        print ('show person name 2');
        return new Center(
            child: new Text('Person Name: ${context.watch<Person>().name}', style: new TextStyle(fontSize: 32.0))
        );
    }
}

class ShowPersonAge2 extends StatelessWidget {
    const ShowPersonAge2 ({Key key}):super(key:key);
    @override
    Widget build (BuildContext context) {
        print ('show person age 2');
        return new Center(
            child: new Text('Person Age: ${context.watch<Person>().age}', style: new TextStyle(fontSize: 32.0))
        );
    }
}

class ChangePersonName extends StatelessWidget {
  const ChangePersonName({Key key}) : super(key:key);
  @override
  Widget build(BuildContext context) {
    return RaisedButton (
      child: Text('Change Person Name'),
      onPressed: () {
        context.read<Person>().changeName();
      },
    );
  }
}

class ChangePersonAge extends StatelessWidget {
  const ChangePersonAge({Key key}) : super (key:key);
  @override
  Widget build(BuildContext context) {
    return RaisedButton (
      child: Text('Change Person Age'),
      onPressed: () {
        context.read<Person>().changeAge();
      },
    );
  }
}

 

provider:

读数据(两种): 

// select 方式,绑定对象里面的属性,重绘少,性能高
final personAge = context.select((Person p)=>p.age);
new Text('Person Age: ${personAge}', style: new TextStyle(fontSize: 32.0));

// 绑定对象, 重绘相对多, 性能相对低
new Text('Person Age: ${context.watch<Person>().age}', style: new TextStyle(fontSize: 32.0))

  

写数据:

RaisedButton (
      child: Text('Change Person Age'),
      onPressed: () {
        context.read<Person>().changeAge();
      },
    );

 

分享到:
评论

相关推荐

    Flutter provider状态管理框架

    Flutter的Provider框架通过简单直观的方式来处理状态管理,降低了学习曲线,提高了开发效率。无论是小型项目还是大型应用,Provider都能提供足够强大的支持。理解并熟练运用Provider,将有助于你构建出更加健壮和可...

    24 Flutter官方推荐的状态管理库provider的深入使用、初始化修改状态、父子组件同步状态.rar

    24 Flutter官方推荐的状态管理库provider的深入使用、初始化修改状态、父子组件同步状态.rar

    Flutter部件内部状态管理小结之实现Vue的v-model功能

    2. 使用Provider:Provider是一个非常流行的Flutter状态管理库,它允许开发者在组件树的上层集中管理状态,并通过构造函数将状态传递给子部件。 3. 使用Bloc或Redux:这些是基于“单向数据流”原则的状态管理库,...

    Flutter+Flutter GetX状态管理+GetX状态管理+Getx状态管理

    目前,Flutter有几种状态管理器。但是,它们中的大多数都涉及到使用ChangeNotifier来更新widget,这对于中大型应用的性能来说是一个糟糕的方法。你可以在Flutter官方文档中查到,ChangeNotifier应该使用1个或最多2个...

    flutter后台管理框架

    4. **状态管理**:在 Flutter 中,BLoC(Business Logic Component)、Provider 或 Riverpod 等状态管理方案可以帮助开发者更好地组织和管理应用程序的状态。 5. **UI 设计**:Flutter 的 Material Design 和 ...

    Flutter 透明状态栏及字体颜色的设置方法

    Flutter 透明状态栏及字体颜色的设置方法 在 Flutter 开发中,设置透明状态栏及字体颜色是一项重要的任务,本文将详细介绍如何设置 Flutter 透明状态栏及字体颜色的方法。 首先,需要在 main.dart 文件中设置 ...

    23 Flutter官方推荐的状态管理库provider的使用.rar

    `provider`是Flutter官方推荐的一种状态管理库,它简化了数据的提供和订阅,使得状态管理变得更为直观和高效。本资料将详细介绍`provider`的使用方法及其核心概念。 `provider`库的核心思想是基于依赖注入...

    Flutter的Provider包:揭秘状态管理的瑞士军刀

    Flutter是一个由Google开发的开源移动UI框架,用于构建高效、高性能的iOS和Android应用程序。Flutter使用Dart语言作为开发语言,这是一门简洁、强类型、并且专为客户端应用性能设计的编程语言。 ### Flutter的主要...

    flutter-state:flutter 状态管理 Provider 、GetX 、BloC 、Stream 使用Demo

    在Flutter开发中,状态管理是应用复杂性的重要组成部分,它涉及到如何在组件之间共享和更新数据。本示例探讨了四种流行的状态管理解决方案:Provider、GetX、Bloc和Stream。这四种方法都基于Dart编程语言,是Flutter...

    flutter-mvvm-provider-demo

    【flutter-mvvm-provider-demo】是一个基于Flutter框架的项目示例,展示了如何在移动应用开发中运用MVVM(Model-View-ViewModel)架构模式,并结合Provider作为状态管理工具。这个项目适用于Android、iOS平台,同时...

    Flutter中一个简单的状态管理框架

    Flutter中一个简单的状态管理框架

    参考假装看天气Android客户端利用Flutter打造的跨平台假装看天气

    2. **状态管理**:Flutter有许多状态管理解决方案,如Provider、Riverpod或Bloc,开发者可能选择了其中一种来处理应用的状态。 3. **本地存储**:如果应用需要保存用户的偏好设置或缓存天气数据,可能使用了sqflite...

    Flutter 订单管理 Demo 涵盖大部分控件用法 --新手可以开始学习开发

    Flutter提供了多种状态管理解决方案,如Provider、Riverpod、Bloc等。新手可以从简单的StatefulWidget和setState()开始,了解如何在Widget间传递数据和更新视图。 4. **网络请求**:为了获取和提交订单数据,你需要...

    用Flutter实现U盘文件管理功能

    在本文中,我们将深入探讨如何使用Flutter框架来实现U盘文件管理功能,这涉及到文件系统的交互、文件遍历、图片解析以及用户界面的构建。Flutter作为一个跨平台的开发工具,可以方便地为Android和iOS等操作系统创建...

    使用Provider和BLoC模式制作的Flutter音乐应用程序

    Provider是Flutter中的一个流行的状态管理库,它简化了Widget树中的数据提供。Provider通过将数据包装在Provider类中并将其添加到Widget树中,使得任何子Widget都能轻松访问和监听数据变化。Provider提供了多种类型...

    flutter学习课件

    5. **State管理**:在Flutter中,状态管理是非常关键的,常见的状态管理工具有Provider、Bloc、Redux等,选择合适的状态管理方案可以提高应用的可维护性。 6. **动画**:Flutter内置了强大的动画系统,无论是简单的...

    Flutter的CLI包管理器和模板

    在Flutter的生态系统中,`CLI(Command Line Interface)`包管理器和模板是提升开发效率的重要工具。本篇文章将深入探讨这两个概念及其在Flutter开发中的作用。 首先,让我们来理解Flutter的CLI包管理器——`pub`。...

    Flutter 学习实例

    综上所述,通过这个"Flutter学习实例"压缩包,你可以实践Dart编程,理解状态管理,掌握布局和动画设计,熟悉第三方库的使用,以及进行应用测试。每个实例都是一次学习和提升的机会,不断探索和实践,你将快速成长为...

    flutter快速学习项目源码、快速集成企业ERP、OA等信息。flutter初学快速入门、flutter毕业设计,

    使用provider (6.x 版本)做状态管理 基于dio (4.x 版本)的网络请求封装 完整的集成测试、可访问性测试。 支持深色模式 本地化(感谢 @ghedwards) 使用Sliver 系列组件实现复杂滚动效果 使用高德地图定位选择地址...

    flutter-provider:提供者的状态管理

    在本文中,我们将深入探讨`flutter-provider`,这是一个在Dart语言中用于Flutter应用程序的状态管理库。`flutter-provider`使得状态管理和数据共享在复杂的Flutter应用中变得更加简单和优雅。它基于Provider库,遵循...

Global site tag (gtag.js) - Google Analytics