runApp(
MultiProvider(
providers: [
//常规用法
ChangeNotifierProvider<ValueProvider>(create: (context)=>ValueProvider('v1','v2',333)),
//代理用法
ChangeNotifierProxyProvider<ValueProvider,ValueChildProvider>(
create: (context)=>ValueChildProvider(Provider.of<ValueProvider>(context,listen: false)),
update: (context,ValueProvider valuePervider,ValueChildProvider valueChildProvider)=>ValueChildProvider(valuePervider),),
],
child:MyApp(),
),
);
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ProviderDemo extends StatefulWidget{
@override
_ProviderDemoState createState()=>_ProviderDemoState();
}
class _ProviderDemoState extends State<ProviderDemo>{
@override
void initState() {
// TODO: implement initState
super.initState();
}
@override
Widget build(BuildContext context) {
print('provider更改调用');
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: Text('provider状态管理样例'),
),
body: Column(
children: [
//context.watch<ValueProvider>()此方法赋值,会调用build重构
Text(context.watch<ValueProvider>()._value1),
Text(context.watch<ValueProvider>()._value2),
Text(context.watch<ValueProvider>()._value3.toString()),
TextButton(
onPressed: (){
context.read<ValueProvider>().changeValue1('value11111');
},
child: Text('修改value1'),
),
TextButton(
onPressed: (){
context.read<ValueProvider>().changeValue2('value22222');
},
child: Text('修改value2'),
),
TextButton(
onPressed: (){
context.read<ValueProvider>().changeValue3(321123);
},
child: Text('修改value3'),
),
TextButton(
onPressed: (){
Navigator.push(context, MaterialPageRoute(builder: (context)=>ProviderDemo1()));
},
child: Text('下一页'),
),
Text(context.select((ValueChildProvider value) => value.valueChild1)),
Text(context.select((ValueChildProvider value) => value.valueChild2)),
Text(context.select((ValueChildProvider value) => value.valueChild3)),
],
),
);
}
}
class ProviderDemo1 extends StatefulWidget{
@override
_ProviderDemo1State createState()=>_ProviderDemo1State();
}
class _ProviderDemo1State extends State<ProviderDemo1>{
@override
void initState() {
// TODO: implement initState
super.initState();
}
@override
Widget build(BuildContext context) {
print('provider更改调用2222');
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: Text('provider状态管理样例2'),
),
body: Consumer<ValueProvider>(
builder: (context,v,child){
return Column(
children: [
Text(v._value1),
Text(v._value2),
Text(v._value3.toString()),
TextButton(
onPressed: (){
v.changeValue1('value1111111111');
},
child: Text('修改value1'),
),
TextButton(
onPressed: (){
context.read<ValueProvider>().changeValue2('value22222222');
//v.changeValue2('value2222222222');
},
child: Text('修改value2'),
),
TextButton(
onPressed: (){
v.changeValue3(321123111);
},
child: Text('修改value3'),
),
Expanded(
flex: 1,
child: Consumer<ValueChildProvider>(
builder: (context,vc,child){
return Column(
children: [
Text(vc.valueChild1),
Text(vc.valueChild2),
Text(vc.valueChild3),
],
);
},
),
),
],
);
},
),
);
}
}
class ValueProvider with ChangeNotifier,DiagnosticableTreeMixin{
String _value1;
String get value1=>_value1;
String _value2;
String get value2=>_value2;
int _value3;
int get value3=>_value3;
ValueProvider(this._value1,this._value2,this._value3);
changeValue1(String v1){
_value1=v1;
notifyListeners();
}
changeValue2(String v2){
_value2=v2;
notifyListeners();
}
changeValue3(int v3){
_value3=v3;
notifyListeners();
}
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
// TODO: implement debugFillProperties
super.debugFillProperties(properties);
properties.add(StringProperty('value1', value1));
properties.add(StringProperty('value2', value2));
properties.add(IntProperty('value2', value3));
}
}
class ValueChildProvider with ChangeNotifier,DiagnosticableTreeMixin{
ValueProvider _valueProvider;
ValueProvider get valueProvider=>_valueProvider;
ValueChildProvider(this._valueProvider);
String get valueChild1{
return _valueProvider._value1+'child value';
}
String get valueChild2{
return _valueProvider._value2+'child value';
}
String get valueChild3{
return _valueProvider._value3.toString()+'child value';
}
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
// TODO: implement debugFillProperties
super.debugFillProperties(properties);
properties.add(StringProperty('value1', valueChild1));
properties.add(StringProperty('value2', valueChild2));
properties.add(StringProperty('value3', valueChild3));
}
}