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框架通过简单直观的方式来处理状态管理,降低了学习曲线,提高了开发效率。无论是小型项目还是大型应用,Provider都能提供足够强大的支持。理解并熟练运用Provider,将有助于你构建出更加健壮和可...
24 Flutter官方推荐的状态管理库provider的深入使用、初始化修改状态、父子组件同步状态.rar
2. 使用Provider:Provider是一个非常流行的Flutter状态管理库,它允许开发者在组件树的上层集中管理状态,并通过构造函数将状态传递给子部件。 3. 使用Bloc或Redux:这些是基于“单向数据流”原则的状态管理库,...
目前,Flutter有几种状态管理器。但是,它们中的大多数都涉及到使用ChangeNotifier来更新widget,这对于中大型应用的性能来说是一个糟糕的方法。你可以在Flutter官方文档中查到,ChangeNotifier应该使用1个或最多2个...
4. **状态管理**:在 Flutter 中,BLoC(Business Logic Component)、Provider 或 Riverpod 等状态管理方案可以帮助开发者更好地组织和管理应用程序的状态。 5. **UI 设计**:Flutter 的 Material Design 和 ...
Flutter 透明状态栏及字体颜色的设置方法 在 Flutter 开发中,设置透明状态栏及字体颜色是一项重要的任务,本文将详细介绍如何设置 Flutter 透明状态栏及字体颜色的方法。 首先,需要在 main.dart 文件中设置 ...
`provider`是Flutter官方推荐的一种状态管理库,它简化了数据的提供和订阅,使得状态管理变得更为直观和高效。本资料将详细介绍`provider`的使用方法及其核心概念。 `provider`库的核心思想是基于依赖注入...
Flutter是一个由Google开发的开源移动UI框架,用于构建高效、高性能的iOS和Android应用程序。Flutter使用Dart语言作为开发语言,这是一门简洁、强类型、并且专为客户端应用性能设计的编程语言。 ### Flutter的主要...
在Flutter开发中,状态管理是应用复杂性的重要组成部分,它涉及到如何在组件之间共享和更新数据。本示例探讨了四种流行的状态管理解决方案:Provider、GetX、Bloc和Stream。这四种方法都基于Dart编程语言,是Flutter...
【flutter-mvvm-provider-demo】是一个基于Flutter框架的项目示例,展示了如何在移动应用开发中运用MVVM(Model-View-ViewModel)架构模式,并结合Provider作为状态管理工具。这个项目适用于Android、iOS平台,同时...
Flutter中一个简单的状态管理框架
2. **状态管理**:Flutter有许多状态管理解决方案,如Provider、Riverpod或Bloc,开发者可能选择了其中一种来处理应用的状态。 3. **本地存储**:如果应用需要保存用户的偏好设置或缓存天气数据,可能使用了sqflite...
Flutter提供了多种状态管理解决方案,如Provider、Riverpod、Bloc等。新手可以从简单的StatefulWidget和setState()开始,了解如何在Widget间传递数据和更新视图。 4. **网络请求**:为了获取和提交订单数据,你需要...
在本文中,我们将深入探讨如何使用Flutter框架来实现U盘文件管理功能,这涉及到文件系统的交互、文件遍历、图片解析以及用户界面的构建。Flutter作为一个跨平台的开发工具,可以方便地为Android和iOS等操作系统创建...
Provider是Flutter中的一个流行的状态管理库,它简化了Widget树中的数据提供。Provider通过将数据包装在Provider类中并将其添加到Widget树中,使得任何子Widget都能轻松访问和监听数据变化。Provider提供了多种类型...
5. **State管理**:在Flutter中,状态管理是非常关键的,常见的状态管理工具有Provider、Bloc、Redux等,选择合适的状态管理方案可以提高应用的可维护性。 6. **动画**:Flutter内置了强大的动画系统,无论是简单的...
在Flutter的生态系统中,`CLI(Command Line Interface)`包管理器和模板是提升开发效率的重要工具。本篇文章将深入探讨这两个概念及其在Flutter开发中的作用。 首先,让我们来理解Flutter的CLI包管理器——`pub`。...
综上所述,通过这个"Flutter学习实例"压缩包,你可以实践Dart编程,理解状态管理,掌握布局和动画设计,熟悉第三方库的使用,以及进行应用测试。每个实例都是一次学习和提升的机会,不断探索和实践,你将快速成长为...
使用provider (6.x 版本)做状态管理 基于dio (4.x 版本)的网络请求封装 完整的集成测试、可访问性测试。 支持深色模式 本地化(感谢 @ghedwards) 使用Sliver 系列组件实现复杂滚动效果 使用高德地图定位选择地址...
在本文中,我们将深入探讨`flutter-provider`,这是一个在Dart语言中用于Flutter应用程序的状态管理库。`flutter-provider`使得状态管理和数据共享在复杂的Flutter应用中变得更加简单和优雅。它基于Provider库,遵循...