1

我有以下问题。我想从 class1 中读取一个变量。读取变量的命令来自另一个类。但是它返回null。这不是我的实际代码,但是我编写了一个演示应用程序来说明问题:当我按下一个按钮时,它应该将 5 添加到存储在 class1 中的名为“number”的变量中,并将使用提供程序包显示在文本小部件中. 然后我想从另一个类中读取变量“数字”。为了显示这是否有效,我在 onPressed 函数中放置了一个打印语句,以显示我的 class2 是否从 class1 获取了值。但是我总是返回 null,我不知道为什么。

简而言之,这是我的 onPressed 函数和两个类:

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();
  }
}
4

1 回答 1

0

当您单击它时,您应该使其异步,并且在 Class2 中 newNumber 仍然为 0。使用 Future 方法并在之后使用 whenComplete(() => null) 。

于 2021-01-17T20:35:33.903 回答