Flutter中Riverpod的.state调用报错问题求助
解决Riverpod 2.x中
.state调用报错的问题 问题原因
你使用的flutter_riverpod: ^2.4.9属于Riverpod 2.x版本,该版本对StateProvider的API做了重大调整:
- 1.x版本中,
ref.watch(StateProvider)返回包含.state属性的对象,需通过.state获取状态值 - 2.x版本中,
ref.watch(StateProvider)直接返回状态原始值(此处为bool类型),不再有.state属性;修改状态需通过notifier对象访问.state
VS Code的报错提示也明确指出:The getter 'state' isn't defined for the type 'bool',因为你尝试在bool值上调用不存在的.state getter。
修改后的完整代码
// my_button_widget.dart import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; final buttonSelectedProvider = StateProvider<bool>((ref) => false); class MyButtonWidget extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { return Scaffold( appBar: AppBar( title: const Text('Riverpod Button Example'), ), body: Center( child: ElevatedButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.resolveWith<Color>( (Set<MaterialState> states) { if (states.contains(MaterialState.pressed)) return Colors.orange; // 直接使用watch返回的bool值,无需.state return ref.watch(buttonSelectedProvider) ? Colors.orange : Colors.white; }, ), ), onPressed: () { // 通过notifier访问state来修改状态 ref.read(buttonSelectedProvider.notifier).state = !ref.read(buttonSelectedProvider); }, child: const Text('Press me'), ), ), ); } }
关键修改点
- 读取状态:将
ref.watch(buttonSelectedProvider).state改为ref.watch(buttonSelectedProvider),直接获取bool类型的状态值 - 修改状态:将
ref.read(buttonSelectedProvider).state改为ref.read(buttonSelectedProvider.notifier).state,通过notifier对象访问可修改的状态属性
原报错提示
The getter 'state' isn't defined for the type 'bool'. Try importing
the library that defines 'state', correcting the name to the name of
an existing getter, or defining a getter or field named
'state'.dartundefined_getter Type: InvalidType
内容的提问来源于stack exchange,提问作者Carlos Peñaranda
相关产品推荐
相关产品推荐

