我正在尝试了解提供程序在颤振中的工作原理,但我仍然没有弄清楚如何使用状态的构造函数来初始化状态。有什么建议吗?
这是构造函数正在监视的类
class Counter extends ChangeNotifier{
int _count;
Counter(int initValue){
_count=initValue;
}
void increment() {
++_count;
notifyListeners();
}
}
Run Code Online (Sandbox Code Playgroud)
首先,您可以将 ChangeNotifier 简化为:
class Counter extends ChangeNotifier {
int count;
Counter(this.count);
void increment() {
count++;
notifyListeners();
}
}
Run Code Online (Sandbox Code Playgroud)
ChangeNotifierProvider现在,将您定义ChangeNotifierProvider为:
ChangeNotifierProvider<Counter>(
create: (context) => Counter(10),
child: child,
),
Run Code Online (Sandbox Code Playgroud)
您可以在此处提供 的初始值Counter。
ChangeNotifierProvider:ChangeNotifierProvider<Counter>(
create: (context) => Counter(10),
child: child,
),
Run Code Online (Sandbox Code Playgroud)
ChangeNotifier CounterConsumer<Counter>(
builder: (context, counter, child) => Text(counter.count.toString()),
Run Code Online (Sandbox Code Playgroud)
在这里,请记住指定您不想听您的提供者的声音。
Provider.of<Counter>(context, listen: false).increment(),
Run Code Online (Sandbox Code Playgroud)
注意:如果您正在学习Provider,请查看来自同一作者的Riverpod 包Provider。它更简单,模板更少:
这是使用 Hooks Riverpod 的相同示例。
ChangeNotifierProviderProvider 只是一个全局变量,存在于ProviderScope我们在MyApp.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(
ChangeNotifierProvider<Counter>(
create: (context) => Counter(10),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'StackOverflow Answer',
home: Scaffold(
body: Center(
child: Consumer<Counter>(
builder: (context, counter, child) => Text(
counter.count.toString(),
style: TextStyle(fontSize: 96),
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () =>
Provider.of<Counter>(context, listen: false).increment(),
child: Icon(Icons.add),
),
),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container();
}
}
class Counter extends ChangeNotifier {
int count;
Counter(this.count);
void increment() {
count++;
notifyListeners();
}
}
Run Code Online (Sandbox Code Playgroud)
ChangeNotifierProvider:useProvider使用 Hooks Riverpos,可以在构建方法的开头使用 Provider :
final counterProvider = ChangeNotifierProvider<Counter>((ref) => Counter(10));
Run Code Online (Sandbox Code Playgroud)
ChangeNotifier CounterProvider这就像从当前读取BuildContext并调用该方法一样简单increment:
final counter = useProvider(counterProvider);
Run Code Online (Sandbox Code Playgroud)
context.read(counterProvider).increment(),
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4286 次 |
| 最近记录: |