我是Flutter的初学者。我收到错误消息:类型'IconData'不是'颜色'类型的子类型。我无法在网络上的任何地方找到它。我该如何解决?我正在开发一个简单的应用程序,有2条路线。我正在使用以下GitHub链接中的代码: https://github.com/flutter/udacity-course/tree/master/course/04_navigation/solution_04_navigation
cartegory.dart文件使用IconData。
我有5个.dart文件,如下所示:
main.dart:
import 'package:flutter/material.dart';
// You can use a relative import, i.e. `import 'category.dart';` or
// a package import, as shown below.
// More details at http://dart-lang.github.io/linter/lints/avoid_relative_lib_imports.html
import 'package:testapp/category.dart';
import 'package:testapp/category_route.dart';
// TODO: Pass this information into your custom [Category] widget
const _categoryName = 'Cake';
const _categoryIcon = Icons.cake;
const _categoryColor = Colors.green;
/// The function that is called when main.dart is run.
void main() {
runApp(UnitConverterApp());
}
/// This widget is the root of our application.
/// Currently, we just show one widget in our app.
class UnitConverterApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
// title: 'Unit Converter',
home: CategoryRoute(),
);
}
}
category_route.dart:
import 'package:flutter/material.dart';
import 'package:testapp/category.dart';
import 'package:testapp/unit.dart';
final _backgroundColor = Colors.green[100];
/// Category Route (screen).
///
/// This is the 'home' screen of the Unit Converter. It shows a header and
/// a list of [Categories].
///
/// While it is named CategoryRoute, a more apt name would be CategoryScreen,
/// because it is responsible for the UI at the route's destination.
class CategoryRoute extends StatelessWidget {
const CategoryRoute();
static const _categoryNames = <String>[
'Length',
'Area',
'Volume',
'Mass',
'Time',
'Digital Storage',
'Energy',
'Currency',
];
static const _baseColors = <Color>[
Colors.teal,
Colors.orange,
Colors.pinkAccent,
Colors.blueAccent,
Colors.yellow,
Colors.greenAccent,
Colors.purpleAccent,
Colors.red,
];
/// Makes the correct number of rows for the list view.
///
/// For portrait, we use a [ListView].
Widget _buildCategoryWidgets(List<Widget> categories) {
return ListView.builder(
itemBuilder: (BuildContext context, int index) => categories[index],
itemCount: categories.length,
);
}
/// Returns a list of mock [Unit]s.
List<Unit> _retrieveUnitList(String categoryName) {
return List.generate(10, (int i) {
i += 1;
return Unit(
name: '$categoryName Unit $i',
conversion: i.toDouble(),
);
});
}
@override
Widget build(BuildContext context) {
final categories = <Category>[];
for (var i = 0; i < _categoryNames.length; i++) {
categories.add(Category(
name: _categoryNames[i],
color: _baseColors[i],
iconLocation: Icons.cake,
units: _retrieveUnitList(_categoryNames[i]),
));
}
final listView = Container(
color: _backgroundColor,
padding: EdgeInsets.symmetric(horizontal: 8.0),
child: _buildCategoryWidgets(categories),
);
final appBar = AppBar(
elevation: 0.0,
title: Text(
'Unit Converter',
style: TextStyle(
color: Colors.black,
fontSize: 30.0,
),
),
centerTitle: true,
backgroundColor: _backgroundColor,
);
return Scaffold(
appBar: appBar,
body: listView,
);
}
}
converter_route.dart:
import 'package:flutter/material.dart';
import 'package:meta/meta.dart';
import 'package:testapp/unit.dart';
/// Converter screen where users can input amounts to convert.
///
/// Currently, it just displays a list of mock units.
///
/// While it is named ConverterRoute, a more apt name would be ConverterScreen,
/// because it is responsible for the UI at the route's destination.
class ConverterRoute extends StatelessWidget {
/// Units for this [Category].
final List<Unit> units;
/// This [ConverterRoute] requires the color and units to not be null.
// TODO: Pass in the [Category]'s color
const ConverterRoute({
@required this.units,
}) : assert(units != null);
@override
Widget build(BuildContext context) {
// Here is just a placeholder for a list of mock units
final unitWidgets = units.map((Unit unit) {
// TODO: Set the color for this Container
return Container(
margin: EdgeInsets.all(8.0),
padding: EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
Text(
unit.name,
style: Theme.of(context).textTheme.headline1,
),
Text(
'Conversion: ${unit.conversion}',
style: Theme.of(context).textTheme.subtitle1,
),
],
),
);
}).toList();
return ListView(
children: unitWidgets,
);
}
}
category.dart:
import 'package:flutter/material.dart';
// @required is defined in the meta.dart package
import 'package:meta/meta.dart';
import 'package:testapp/converter_route.dart';
import 'package:testapp/unit.dart';
// We use an underscore to indicate that these variables are private.
// See https://www.dartlang.org/guides/language/effective-dart/design#libraries
final _rowHeight = 100.0;
final _borderRadius = BorderRadius.circular(_rowHeight / 2);
/// A custom [Category] widget.
///
/// The widget is composed on an [Icon] and [Text]. Tapping on the widget shows
/// a colored [InkWell] animation.
class Category extends StatelessWidget {
final String name;
final ColorSwatch color;
final IconData iconLocation;
final List<Unit> units;
/// Creates a [Category].
///
/// A [Category] saves the name of the Category (e.g. 'Length'), its color for
/// the UI, and the icon that represents it (e.g. a ruler).
// While the @required checks for whether a named parameter is passed in,
// it doesn't check whether the object passed in is null. We check that
// in the assert statement.
const Category({
Key key,
@required this.name,
@required this.color,
@required this.iconLocation,
@required this.units,
}) : assert(name != null),
assert(color != null),
assert(iconLocation != null),
assert(units != null),
super(key: key);
/// Navigates to the [ConverterRoute].
void _navigateToConverter(BuildContext context) {
Navigator.of(context).push(MaterialPageRoute<Null>(
builder: (BuildContext context) {
return Scaffold(
appBar: AppBar(
elevation: 1.0,
title: Text(
name,
style: Theme.of(context).textTheme.display1,
),
centerTitle: true,
backgroundColor: color,
),
body: ConverterRoute(
color: color,
units: units,
),
);
},
));
}
/// Builds a custom widget that shows [Category] information.
///
/// This information includes the icon, name, and color for the [Category].
@override
// This `context` parameter describes the location of this widget in the
// widget tree. It can be used for obtaining Theme data from the nearest
// Theme ancestor in the tree. Below, we obtain the display1 text theme.
// See https://docs.flutter.io/flutter/material/Theme-class.html
Widget build(BuildContext context) {
return Material(
color: Colors.transparent,
child: Container(
height: _rowHeight,
child: InkWell(
borderRadius: _borderRadius,
highlightColor: color,
splashColor: color,
// We can use either the () => function() or the () { function(); }
// syntax.
onTap: () => _navigateToConverter(context),
child: Padding(
padding: EdgeInsets.all(8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
// There are two ways to denote a list: `[]` and `List()`.
// Prefer to use the literal syntax, i.e. `[]`, instead of `List()`.
// You can add the type argument if you'd like, i.e. <Widget>[].
// See https://www.dartlang.org/guides/language/effective-dart/usage#do-use-collection-literals-when-possible
children: [
Padding(
padding: EdgeInsets.all(16.0),
child: Icon(
iconLocation,
size: 60.0,
),
),
Center(
child: Text(
name,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headline,
),
),
],
),
),
),
),
);
}
}
unit.dart:
import 'package:meta/meta.dart';
/// Information about a [Unit].
class Unit {
final String name;
final double conversion;
/// A [Unit] stores its name and conversion factor.
///
/// An example would be 'Meter' and '1.0'.
const Unit({
@required this.name,
@required this.conversion,
}) : assert(name != null),
assert(conversion != null);
/// Creates a [Unit] from a JSON object.
Unit.fromJson(Map jsonMap)
: assert(jsonMap['name'] != null),
assert(jsonMap['conversion'] != null),
name = jsonMap['name'],
conversion = jsonMap['conversion'].toDouble();
}
答案 0 :(得分:1)
这是您向图标而不是通过IconData添加颜色的方式。
图标( Icons.widgets, 颜色:Colors.blue, )