flutter - “Widget”类型的值不能分配给“PreferredSizeWidget”类型的变量
问题描述
该程序中有 2 个错误已在上图中显示
Main.dart 文件
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Personal Expenses ',
theme: ThemeData(
primarySwatch: Colors.green,
accentColor: Colors.amber,
//errorColor: Colors.red[700],
fontFamily: 'Quicksand',
textTheme: ThemeData.light().textTheme.copyWith(
title: TextStyle(
fontFamily: 'OpenSans',
fontWeight: FontWeight.bold,
fontSize: 18,
),
button: TextStyle(color: Colors.amber)),
appBarTheme: AppBarTheme(
textTheme: ThemeData.light().textTheme.copyWith(
title: TextStyle(
fontFamily: 'OpenSans',
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final List<Transaction> _userTransactions = [
];
bool _showChart = false;
List<Transaction> get _recentTransactions {
return _userTransactions.where((tx) {
return tx.date.isAfter(
DateTime.now().subtract(
Duration(days: 7),
),
);
}).toList();
}
void _addNewTransaction(
String txTitle, double txAmount, DateTime chosenDate) {
final newTx = Transaction(
title: txTitle,
amount: txAmount,
date: chosenDate,
id: DateTime.now().toString(),
);
setState(() {
_userTransactions.add(newTx);
});
}
void _startAddNewTransaction(BuildContext ctx) {
showModalBottomSheet(
context: ctx,
builder: (_) {
return GestureDetector(
onTap: () {},
child: NewTransaction(_addNewTransaction),
behavior: HitTestBehavior.opaque,
);
},
);
}
void _deleteTransaction(String id) {
setState(() {
_userTransactions.removeWhere((tx) => tx.id == id);
});
}
@override
Widget build(BuildContext context) {
final mediaQuery = MediaQuery.of(context);
final isLandscape = mediaQuery.orientation == Orientation.landscape;
final PreferredSizeWidget appbar = Platform.isIOS
“Widget”类型的值不能分配给“PreferredSizeWidget”类型的变量。
? CupertinoNavigationBar(
middle: Text(
'Personal Expenses ',
),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
GestureDetector(
child: Icon(CupertinoIcons.add),
onTap: () => _startAddNewTransaction(context),
)
],
),
)
: AppBar(
title: Text(
'Personal Expenses ',
style: TextStyle(fontFamily: 'OpenSans'),
),
actions: <Widget>[
IconButton(
icon: Icon(Icons.add),
onPressed: () => _startAddNewTransaction(context),
),
],
);
final txListWidget = Container(
height: (mediaQuery.size.height -
appbar.preferredSize.height -
mediaQuery.padding.top) *
0.7,
child: TransactionList(
_userTransactions,
_deleteTransaction,
),
);
final pageBody = SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
if (isLandscape)
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Show Chart'),
Switch.adaptive(
activeColor: Theme.of(context).accentColor,
value: _showChart,
onChanged: (val) {
setState(() {
_showChart = val;
});
},
),
],
),
],
),
);
返回 Platform.isIOS ?CupertinoPageScaffold(子:pageBody,navigationBar:appbar,
参数类型“PreferredSizeWidget”不能分配给参数类型“ObstructingPreferredSizeWidget?”。
)
: Scaffold(
.........,
),
);
}
}
解决方案
您的代码在 Flutter 的非空安全版本中工作。我不知道为什么 null 安全版本现在反对:
final PreferredSizeWidget appbar = Platform.isIOS ...
如果省略类型:
final appbar = Platform.isIOS ...
然后appbar
被解释为 aWidget
并在 上给出错误appbar.preferredSize
。
您可以强制在运行时检查类型:
final dynamic appbar = Platform.isIOS ...
这适用于我使用我的 Android 设备进行测试。但是,我还没有使用 Apple 设备进行测试。
我创建了这个颤振问题,以改变使用 null 安全版本颤振的行为。您可以订阅问题以获取更新通知。
编辑: Flutter 团队提出了一个Dart 问题,解释了新的行为并建议使用:
final PreferredSizeWidget appbar = (Platform.isIOS ? CupertinoNavigationBar() : AppBar())
as PreferredSizeWidget;
推荐阅读
- google-sheets - 根据从电子表格中另一个单元格中的值获得的引用获取单元格中的值
- spring-boot - Jenkins 未能执行目标 Maven 发布
- java - 无法访问 openapi-generator-cli.jar 文件
- amazon-web-services - AWS:在为实例指定安全组时,它的 ENI 是否在后台指定了安全组?
- ajax - QUnit 测试 AJAX 调用
- deep-learning - 我如何在 Julia 中创建一个包并开源它?
- flutter - 是否可以在移动应用程序中使用营销 API?
- php - PHP 获得与文本颜色白色兼容的随机颜色?
- c# - C# 开发人员命令提示符
- python - Scrapy:星级