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)
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)
| 归档时间: |
|
| 查看次数: |
2037 次 |
| 最近记录: |