Flutter - 在多个提供者之间共享数据

teh*_*aab 1 dart flutter flutter-provider

我正在构建一个 Flutter 应用程序,它有一个主要提供程序,其中包含会话 id 和许多其他“全局”属性。

class AppService with ChangeNotifier {
    String _sessionId;
    String _name;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我还有其他几个处理非常具体的事情的提供程序(AppService 也开始变得很大,所以必须将其拆分出来)。

我的问题是如何从其他服务(例如将它们命名为 ServiceB、ServiceC 和 ServiceD)访问 AppService 中的 _sessionId、名称和其他属性?是否可以从另一个(例如 ServiceB)调用 AppService 中的函数?

class ServiceB with ChangeNotifier {
    ...
}

class ServiceC with ChangeNotifier {
    ...
}

class ServiceD with ChangeNotifier {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我看到有人提到ChangeNotifierProxyProvider,但不确定这是否会给我带来我需要的东西,因为我需要访问多个其他类中的 AppService 。

这是我的提供商当前的设置方式。

MultiProvider(
    providers: [
      ChangeNotifierProvider<AppService>(
        create: (_) => AppService(),
      ),
      ChangeNotifierProvider<ServiceB>(
        create: (_) => ServiceB(),
      ),
      ChangeNotifierProvider<ServiceC>(
        create: (_) => ServiceC(),
      ),
      ChangeNotifierProvider<ServiceD>(
        create: (_) => ServiceD(),
      ),
    ],
    child: const InitSysApp(),
  )
Run Code Online (Sandbox Code Playgroud)

Hem*_*h S 6

ProxyProvider您可以从provider酒吧使用

    import 'dart:collection';
    import 'package:flutter/foundation.dart';
    import 'package:flutter/material.dart';

    class Person with ChangeNotifier {
      Person({this.name, this.age});

      final String name;
      int age;

      void increaseAge() {
        this.age++;
        notifyListeners();
      }
    }

    class Job with ChangeNotifier {
      Job(
        this.person, {
        this.career,
      });

      final Person person;
      String career;
      String get title {
        if (person.age >= 28) return 'Dr. ${person.name}, $career PhD';
        return '${person.name}, Student';
      }
    }

    void main() {
      runApp(
        MultiProvider(
          providers: [
            ChangeNotifierProvider<Person>(
                create: (_) => Person(name: 'Yohan', age: 25)),
            ChangeNotifierProxyProvider<Person, Job>(
              create: (BuildContext context) =>
                  Job(Provider.of<Person>(context, listen: false)),
              update: (BuildContext context, Person person, Job job) =>
                  Job(person, career: 'Vet'),
            ),
          ],
          child: MyApp(),
        ),
      );
    }

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return const MaterialApp(
          home: MyHomePage(),
        );
      }
    }

    class MyHomePage extends StatelessWidget {
      const MyHomePage({Key key}) : super(key: key);

      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('Provider Class'),
          ),
          body: Align(
            alignment: Alignment.center,
            child: Container(
              padding: EdgeInsets.all(20.0),
              decoration: BoxDecoration(
                border: Border.all(),
                borderRadius: BorderRadius.circular(5.0),
              ),
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: <Widget>[
                  Text(
                    'Hi, may name is ${context.select((Job j) => j.person.name)}',
                    style: Theme.of(context).textTheme.headline6,
                  ),
                  Text('Age: ${context.select((Job j) => j.person.age)}'),
                  Text(context.watch<Job>().title),
                ],
              ),
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () =>
                Provider.of<Person>(context, listen: false).increaseAge(),
          ),
        );
      }
    }
Run Code Online (Sandbox Code Playgroud)