尝试从类中读取数据但返回 null 而不是其实际值 - 使用 Flutter Provider
Posted
技术标签:
【中文标题】尝试从类中读取数据但返回 null 而不是其实际值 - 使用 Flutter Provider【英文标题】:Try to read data from a class but returns null instead of its actual value - using Flutter Provider 【发布时间】:2021-04-22 04:31:12 【问题描述】:我有以下问题。我想从 class1 中读取一个变量。读取变量的命令来自另一个类。但是它返回null。这不是我的实际代码,但是我编写了一个演示应用程序来说明问题:当我按下按钮时,它应该将 5 添加到存储在 class1 中的名为“number”的变量中,并将使用 Provider Package 显示在文本小部件中.然后我想从另一个类中读取变量“数字”。为了显示这是否有效,我在 onPressed 函数中放置了一个打印语句,以显示我的 class2 是否从 class1 获取了值。但是我总是返回 null,我不知道为什么。
简而言之,这是我的 onPressed Function 和两个类:
onPressed: ()
class1.addNumber(5);
print(class1.number);
print(class2.numberFromClass1);
,
class Class1 extends ChangeNotifier
int number;
void addNumber(value)
number = number + value;
notifyListeners();
get getNumber
return number;
class Class2 extends ChangeNotifier
int numberFromClass1;
void getNumberFromClass1()
numberFromClass1 = Class1().getNumber;
print(numberFromClass1);
notifyListeners();
要么class1中的变量“number”没有改变,要么class2无法从class1中读取变量“number”并将其存储在自己的变量中。
感谢您的帮助!
这是整个演示程序:
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: (context) => Class1(),
),
ChangeNotifierProxyProvider<Class1, Class2>(
update: (BuildContext context, class1, class2) => Class2(),
create: (context) => Class2()),
],
child: MaterialApp(initialRoute: HomePage.id, routes:
HomePage.id: (context) => HomePage(),
),
);
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class HomePage extends StatelessWidget
static const String id = 'home_page';
@override
Widget build(BuildContext context)
return Consumer2<Class1, Class2>(
builder: (context, class1, 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);
print(class1.number);
print(class2.numberFromClass1);
,
),
],
),
),
);
,
);
class Class1 extends ChangeNotifier
int number;
void addNumber(value)
number = number + value;
notifyListeners();
get getNumber
return number;
class Class2 extends ChangeNotifier
int numberFromClass1;
void getNumberFromClass1()
numberFromClass1 = Class1().getNumber;
print(numberFromClass1);
notifyListeners();
【问题讨论】:
【参考方案1】:当你点击它时你应该让它异步,在 Class2 中 newNumber 仍然是 0。使用 Future 方法并在之后使用 whenComplete(() => null)。
【讨论】:
您好 Mustafa,非常感谢您的回答。我尝试了您的解决方案,但是即使使用 Future 方法,我仍然从我的 class2 返回 0。我使用 ChangeNotifierProxyProvider 检查了一些示例,但找不到任何代码,它结合了 Future、async 和 await。也许我做错了什么(很可能是因为我是编程新手)或者我需要另一个 Provider 来让它工作,比如 Future Provider? 简单地在你的 onPress 调用一个 Future 方法。 await calculateNewNumber().then((value) ).whenComplete(() calculateNewNumber(); ); 当我调用 doSomethingWithClass1Data() 时,我仍然打印出 0。但是,我真的很感谢您的帮助。这是我的 onPressed 函数: onPressed: () async await class1 .calculateNewNumber(5) .then((value) ) .whenComplete(() Class2().doSomethingWithClass1Data(); 是否还有办法获得来自 class1 的数据与我在 class2 中执行的调用而不是在 inPressed 函数中执行此操作?以上是关于尝试从类中读取数据但返回 null 而不是其实际值 - 使用 Flutter Provider的主要内容,如果未能解决你的问题,请参考以下文章
Firebase Rest Api 从我的模型类中读取数据返回 null [重复]
std :: current_exception应该从类的析构函数中的catch块返回非null值
SQL Server DataReader.GetField 返回 null 而不是地理数据