之前使用Provider时候,都是使用create()进行创建一个新值,倘若我们想要观测一个已经存在的实例化对象时候,就不可以这样了。
这时候需要使用Provider.value的方式或者其它类的.value,例如ChangeNotifierProvider.value
该方法也可以将内部的某个值提供给其子类,代码主要源自以下链接:
https://flutterbyexample.com/lesson/using-value-constructors
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class Person with ChangeNotifier {
Person({this.name, this.age});
final String name;
int age;
void increaseAge() {
this.age++;
notifyListeners();
}
}
void main() {
runApp(
ChangeNotifierProvider(
create: (_) => Person(name: "Yohan", age: 25),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@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('YM-----MyHomePage---->重新build');
return Scaffold(
appBar: AppBar(
title: const Text('Provider Class'),
),
body: Center(
child: PersonsNameLabel(),
),
floatingActionButton: FloatingActionButton(
onPressed: () => Provider.of<Person>(context, listen: false).increaseAge(),
),
);
}
}
class PersonsNameLabel extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider<String>.value(
value: Provider.of<Person>(context).name,
builder: (BuildContext context, Widget child) {
print('YM---PersonsNameLabel---->重新build');
return Text('${context.watch<String>()}');
},
);
}
}