0

为什么当我在代码中调用 addNumber(){...} 方法时,class1 中的变量“数字”没有改变?打印语句“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, 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);
                    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;
  }
}
4

1 回答 1

0

您可以在下面复制粘贴运行完整代码
第 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;

第三步: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(),
        ),
        ChangeNotifierProxyProvider<Class1, Class2>(
          create: (BuildContext context) =>
              Class2(Provider.of<Class1>(context, listen: false)),
          update: (BuildContext context, class1, class2) =>
              class2..update(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, 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);
                    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;
  }
}
于 2021-01-20T08:45:21.130 回答