如何解决为什么我的变量没有在使用 Flutter Provider 和 ChangeNotifierProxyProvider 的类中更新?
为什么当我在代码中调用 addNumber(){...} 方法时,class1 中的变量“number”没有改变?打印语句“print(class2.numberFromClass1)”仅返回我直接存储在 class1 中的值,而不返回由 addNumber(){} 方法计算的新值。我正在使用提供程序包。我认为一个原因可能是,我如何构建 ChangeNotifierProxyProvider,但我尝试了许多不同的方法,但它仍然无法正常工作。这是带有打印语句和两个类的部分:
onPressed: () {
class1.addNumber(5);
class2.addNumberFromClass1();
print(class1.number);
print(class2.numberFromClass1); //this returns either null,or the int which I directly write to number in Class1. e.g int number = 3; it prints 3.
},class Class1 extends ChangeNotifier {
int number; //This stays always the same.
void addNumber(value) {
number = number +
value; //after adding value to number,the new calculated number should be stored in number.
notifyListeners();
}
get getNumber {
return number;
}
}
class Class2 extends ChangeNotifier {
int numberFromClass1;
void addNumberFromClass1() {
numberFromClass1 = Class1().getNumber; //Here I want to get 'number' from class1
print(numberFromClass1);
notifyListeners();
}
get getNumberFromClass1 {
return numberFromClass1;
}
}
这就是完整的代码:
import 'package:demo_app/home_page.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<Class1>(
create: (_) => Class1(),),ChangeNotifierProxyProvider<Class1,Class2>(
create: (BuildContext context) => Class2(),update: (BuildContext context,class1,class2) => (Class2()),],child: MaterialApp(initialRoute: HomePage.id,routes: {
HomePage.id: (context) => HomePage(),}),);
}
}
class HomePage extends StatelessWidget {
static const String id = 'home_page';
@override
Widget build(BuildContext context) {
return Consumer2<Class1,Class2>(
builder: (context,class2,child) {
return Scaffold(
backgroundColor: Colors.blueAccent,body: Container(
alignment: Alignment.center,color: Colors.blueAccent,child: Column(
mainAxisAlignment: MainAxisAlignment.center,children: [
Text(class1.number.toString()),SizedBox(height: 50),MaterialButton(
color: Colors.deepOrangeAccent,height: 100,minWidth: 100,child: Text(
'5',style: TextStyle(fontSize: 40),onPressed: () {
class1.addNumber(5);
class2.addNumberFromClass1();
print(class1.number);
print(class2
.numberFromClass1); //this returns either null,or the int which I directly write to number in Class1. e.g int number = 3; it prints 3.
},);
},);
}
}
class Class1 extends ChangeNotifier {
int number; //This stays always the same.
void addNumber(value) {
number = number +
value; //after adding value to number,the new calculated number should be stored in number.
notifyListeners();
}
get getNumber {
return number;
}
}
class Class2 extends ChangeNotifier {
int numberFromClass1;
void addNumberFromClass1() {
numberFromClass1 = Class1().getNumber;
print(numberFromClass1);
notifyListeners();
}
get getNumberFromClass1 {
return numberFromClass1;
}
}
解决方法
您可以在下面复制粘贴运行完整代码
第 1 步:使用 ChangeNotifierProxyProvider
注入 class1
return MultiProvider(
providers: [
ChangeNotifierProvider<Class1>(
create: (_) => Class1(),),ChangeNotifierProxyProvider<Class1,Class2>(
create: (BuildContext context) =>
Class2(Provider.of<Class1>(context,listen: false)),update: (BuildContext context,class1,class2) =>
class2..update(class1),],
第 2 步:初始化 number = 0;
class Class1 extends ChangeNotifier {
int number = 0;
第 3 步:Class2
constructor
需要 Class1 class1
并使用 class1.getNumber
class Class2 extends ChangeNotifier {
Class1 class1;
int numberFromClass1;
Class2(this.class1);
void update(Class1 value) {
class1 = value;
}
void addNumberFromClass1() {
numberFromClass1 = class1.getNumber;
工作演示
工作演示的输出
I/flutter ( 6716): numberFromClass1 5
I/flutter ( 6716): class1.number 5
I/flutter ( 6716): class2.numberFromClass1 5
I/flutter ( 6716): numberFromClass1 10
I/flutter ( 6716): class1.number 10
I/flutter ( 6716): class2.numberFromClass1 10
I/flutter ( 6716): numberFromClass1 15
I/flutter ( 6716): class1.number 15
I/flutter ( 6716): class2.numberFromClass1 15
完整代码
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<Class1>(
create: (_) => Class1(),child: MaterialApp(initialRoute: HomePage.id,routes: {
HomePage.id: (context) => HomePage(),}),);
}
}
class HomePage extends StatelessWidget {
static const String id = 'home_page';
@override
Widget build(BuildContext context) {
return Consumer2<Class1,Class2>(
builder: (context,class2,child) {
return Scaffold(
backgroundColor: Colors.blueAccent,body: Container(
alignment: Alignment.center,color: Colors.blueAccent,child: Column(
mainAxisAlignment: MainAxisAlignment.center,children: [
Text(class1.number.toString()),SizedBox(height: 50),MaterialButton(
color: Colors.deepOrangeAccent,height: 100,minWidth: 100,child: Text(
'5',style: TextStyle(fontSize: 40),onPressed: () {
class1.addNumber(5);
class2.addNumberFromClass1();
print("class1.number ${class1.number}");
print(
"class2.numberFromClass1 ${class2.numberFromClass1}"); //this returns either null,or the int which I directly write to number in Class1. e.g int number = 3; it prints 3.
},);
},);
}
}
class Class1 extends ChangeNotifier {
int number = 0; //This stays always the same.
void addNumber(value) {
number = number +
value; //after adding value to number,the new calculated number should be stored in number.
notifyListeners();
}
get getNumber {
return number;
}
}
class Class2 extends ChangeNotifier {
Class1 class1;
int numberFromClass1;
Class2(this.class1);
void update(Class1 value) {
class1 = value;
}
void addNumberFromClass1() {
numberFromClass1 = class1.getNumber;
print("numberFromClass1 ${numberFromClass1}");
notifyListeners();
}
get getNumberFromClass1 {
return numberFromClass1;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。