flutter - 为什么我的应用程序没有在一个简单的计数器中通过 ProviderListener?
问题描述
我正在测试riverpod,但它不起作用。
我只想拥有一个典型的计数器,当它达到两个时它会转到另一个屏幕。计数器工作但不启动第二个屏幕或通过 ProviderListener。
void main() {
runApp(ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
final _counterProvider = StateNotifierProvider<CounterStateNotifier>((ref) {
return CounterStateNotifier();
});
class CounterStateNotifier extends StateNotifier<int> {
CounterStateNotifier([int count]) : super(count ?? 0);
void increment() {
state++;
}
}
class MyHomePage extends ConsumerWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
Widget build(BuildContext context, ScopedReader watch) {
final int _counter = watch(_counterProvider.state);
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: ProviderListener<StateNotifier<int>>(
provider: _counterProvider,
onChange: (context, _counter) {
if (_counter == 2) {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (BuildContext context) => ScondScreen(),
),
);
}
},
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
context.read(_counterProvider).increment();
},
tooltip: 'Increment',
child: Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
我还没有找到一个 ProviderListener 示例来指导我。
Lorem ipsum dolor sit amet, consectetur adipiscing elit。Vivamus vel sem velit。Sed 调味品 convallis sollicitudin。Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus。Quisque maximus congue porttitor。
解决方案
因为我个人在通过为我发现这个新事物来提供帮助之前并没有使用它。
在这里我可以看到: https ://riverpod.dev/docs/concepts/reading#providerlistener
该代码是
Widget build(BuildContext context) {
return ProviderListener<StateController<int>>(
provider: counterProvider,
onChange: (context, counter) {
if (counter.state == 5) {
showDialog(...);
}
},
child: Whatever(),
);
}
不同之处在于,在示例中有counter.state == variable
和在你的counter == variable
,但如果 onChange 甚至没有触发,那么可能就是这种情况
ProviderListener<StateController<int>>
在你的情况下,它基于 stateNotifier 而不是控制器(我猜它不一样)
ProviderListener<StateNotifier<int>>
推荐阅读
- r - 使用交互时从 ggplot2 中删除重复的标签
- javascript - 从拖动的元素中获取父数据元素 - 拖放功能
- python - 是否可以选择一个特定的按钮,即在一个页面上多次使用硒?
- c - 使用 C 编程在 Sin(x)/sqrt(x) 的 0 和无穷大之间与梯形规则进行数值积分
- python - how can i edit instance of the Project class in the Django shell after i created
- node.js - 有没有办法在 Outlook 中的 ics 格式的日历订阅 url 上进行身份验证?
- python - 在 Keras 中,如何通过 predict 方法获得相同的评估方法准确度值?
- javascript - TypeError:IOS 上的 window.postMessage 参数不足
- botframework - 如何在 qnamaker 中将 URL 设为纯文本而不是超链接
- api - 从在 iframe 中打开的 topdesk 站点获取身份验证