有人可以告诉我提供者如何通知国家吗?
我不想使用 ChangeNotifierProvider,你能给我一个没有库的建议吗?
我只需要通过示例进行更好的解释。提供者如何结合 InheritedWidget。
有人可以告诉我提供者如何通知国家吗?
我不想使用 ChangeNotifierProvider,你能给我一个没有库的建议吗?
我只需要通过示例进行更好的解释。提供者如何结合 InheritedWidget。
这是给你的一些想法:
小部件侦听更改并在重建时相互通知。一旦状态发生变化,该特定小部件就会重建,而不会影响树中的其他小部件。
三个主要组件使这一切成为可能:Flutter 中的 ChangeNotifier 类、ChangeNotifierProvider(主要用于我们的示例应用程序)和 Consumer 小部件。
从 ChangeNotifier 类观察到的任何状态变化都会导致监听小部件重建。Provider 包提供了不同类型的提供者——下面列出了其中的一些:
Provider 类接受一个值并将其公开,无论值类型如何 ListenableProvider 是用于可侦听对象的特定提供程序。它将侦听,然后根据它并受状态更改影响的小部件在任何时候调用侦听器来重建 ChangeNotifierProvider 类似于 ListenableProvider 但对于 ChangeNotifier 对象,并在需要时自动调用 ChangeNotifier.dispose ValueListenableProvider 侦听 ValueListenable 并公开价值
StreamProvider 侦听流,公开发出的最新值,并要求依赖于流的小部件重建 FutureProvider 采用 Future 类并在未来完成时根据它更新小部件
您如何看待以下示例(受此处的答案启发)AnimatedBuilder:
import 'package:flutter/material.dart';
class MyChangeNotifier extends ChangeNotifier {
int count = 0;
void addOne() {
count++;
notifyListeners();
}
}
class MyApp extends StatelessWidget {
final MyChangeNotifier myChangeNotifier = MyChangeNotifier();
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: ExampleButton(myChangeNotifier),
),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.add),
onPressed: myChangeNotifier.addOne,
),
),
);
}
}
class ExampleButton extends StatelessWidget {
final MyChangeNotifier myChangeNotifier;
const ExampleButton(this.myChangeNotifier, {Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: myChangeNotifier,
builder: (context, child) {
return OutlinedButton(
onPressed: myChangeNotifier.addOne,
child: Text(
'Tap me - or the floating button\n\n${myChangeNotifier.count}',
textAlign: TextAlign.center,
));
});
}
}
void main() => runApp(MyApp());
ChangeNotifier实现类Listenable。您可以在此处查看如何收听Listenable,例如使用AnimatedBuilder(我的代码所做的)。A ChangeNotifyProvider(我知道,你不想要那个)也会为你实现它,并通知你在小部件树中较低的小部件关于更改。
作为从本文中学习提供者的建议-
https://medium.com/flutter-community/making-sense-all-of-those-flutter-providers-e842e18f45dd