尝试从类中读取数据但返回 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 而不是地理数据

为啥我的 jwt 令牌在背面而不是正面返回 null

Javascript - 从数组中查找所有类,从类中获取并返回内部文本

ConfigurationManager 返回 null 而不是字符串值