Flutter中IconButton.filled()未定义及构造器错误求助
问题描述
测试Flutter官方Material3风格的IconButton时出现错误,通过官方示例命令创建项目后问题依然存在。创建项目的命令:
flutter create --sample=material.IconButton.3 mysample
项目代码
import 'package:flutter/material.dart'; /// Flutter code sample for [IconButton]. void main() { runApp(const IconButtonApp()); } class IconButtonApp extends StatelessWidget { const IconButtonApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData( colorSchemeSeed: const Color(0xff6750a4), useMaterial3: true), title: 'Icon Button Types', home: const Scaffold( body: ButtonTypesExample(), ), ); } } class ButtonTypesExample extends StatelessWidget { const ButtonTypesExample({super.key}); @override Widget build(BuildContext context) { return const Padding( padding: EdgeInsets.all(4.0), child: Row( // 此处出现错误(Error 1) children: <Widget>[ Spacer(), ButtonTypesGroup(enabled: true), ButtonTypesGroup(enabled: false), Spacer(), ], ), ); } } class ButtonTypesGroup extends StatelessWidget { const ButtonTypesGroup({super.key, required this.enabled}); final bool enabled; @override Widget build(BuildContext context) { final VoidCallback? onPressed = enabled ? () {} : null; return Padding( padding: const EdgeInsets.all(4.0), child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: <Widget>[ IconButton( icon: const Icon(Icons.filter_drama), onPressed: onPressed), // 填充式图标按钮 IconButton.filled( // 错误(Error 2) onPressed: onPressed, icon: const Icon(Icons.filter_drama)), // 填充色调式图标按钮 IconButton.filledTonal( // 错误(Error 2) onPressed: onPressed, icon: const Icon(Icons.filter_drama)), // 轮廓式图标按钮 IconButton.outlined( // 错误(Error 2) onPressed: onPressed, icon: const Icon(Icons.filter_drama)), ], ), ); } }
错误信息
- Error 1:调用的构造器不是const构造器。尝试从构造器调用中移除'const'。dart(const_with_non_const)
- Error 2:类型'IconButton'未定义方法'filled'。尝试将名称更正为现有方法的名称,或者定义一个名为'filled'的方法。dart(undefined_method)
pubspec.yaml 配置
name: mysample description: A new Flutter project. # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev # The following defines the version and build number for your application. # A version number is three numbers separated by dots, like 1.2.43 # followed by an optional build number separated by a +. # Both the version and the builder number may be overridden in flutter # build by specifying --build-name and --build-number, respectively. # In Android, build-name is used as versionName while build-number used as versionCode. # Read more about Android versioning at https://developer.android.com/studio/publish/versioning # In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. version: 1.0.0+1 environment: sdk: '>=2.19.6 <3.0.0' # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions # consider running `flutter pub upgrade --major-versions`. Alternatively, # dependencies can be manually updated by changing the version numbers below to # the latest version available on pub.dev. To see which dependencies have newer # versions available, run `flutter pub outdated`. dependencies: flutter: sdk: flutter # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 dev_dependencies: flutter_test: sdk: flutter # The "flutter_lints" package below contains a set of recommended lints to # encourage good coding practices. The lint set provided by the package is # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^2.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec # The following section is specific to Flutter packages. flutter: # The following line ensures that the Material Icons font is # included with your application, so that you can use the icons in # the material Icons class. uses-material-design: true # To add assets to your application, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware # For details regarding adding assets from package dependencies, see # https://flutter.dev/assets-and-images/#from-packages # To add custom fonts to your application, add a fonts section here, # in this "flutter" section. Each entry in this list should have a # "family" key with the font family name, and a "fonts" key with a # list giving the asset and other descriptors for the font. For # example: # fonts: # - family: Schyler # fonts: # - asset: fonts/Schyler-Regular.ttf # - asset: fonts/Schyler-Italic.ttf # style: italic # - family: Trajan Pro # fonts: # - asset: fonts/TrajanPro.ttf # - asset: fonts/TrajanPro_Bold.ttf # weight: 700 # # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages
Flutter 环境信息
Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 3.7.10, on macOS 13.3.1 22E772610a darwin-arm64, locale en-JP) [✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0) [✓] Xcode - develop for iOS and macOS (Xcode 14.2) [✓] Chrome - develop for the web [✓] Android Studio (version 2021.2) [✓] VS Code (version 1.78.2) [✓] Connected device (3 available) [✓] HTTP Host Availability • No issues found!
解决方案
解决 Error 2(核心问题)
IconButton.filled()、filledTonal()、outlined() 这些静态构造方法是 Flutter 3.10 版本才正式引入的特性,你当前使用的 Flutter 3.7.10 稳定版不支持这些方法。执行以下命令升级 Flutter:
flutter channel stable flutter upgrade
解决 Error 1
Spacer 没有 const 构造函数,因此包含 Spacer 的 Row 不能被声明为 const,同时外层的 Padding 也不能是 const(因为其 child 是非 const 的 Row)。修改 ButtonTypesExample 的 build 方法:
@override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(4.0), child: Row( children: <Widget>[ Spacer(), ButtonTypesGroup(enabled: true), ButtonTypesGroup(enabled: false), Spacer(), ], ), ); }
内容的提问来源于stack exchange,提问作者Yukinosuke Takada
相关产品推荐
相关产品推荐

