flutter - 当我按下我的 FlotaingButton 或 AppBar IconButton 时出现异常。我已经在 _MyAppHomePage 中添加了一个 Scffold
问题描述
发生异常。FlutterError(未找到 Scaffold 小部件。MyHomePage 小部件需要 Scaffold 小部件祖先。找不到 Scaffold 祖先的特定小部件是:MyHomePage 此小部件的祖先是:Semantics Builder RepaintBoundary-[GlobalKey#5c844] IgnorePointer AnimatedBuilder FadeTransition FractionalTranslation SlideTransition _FadeUpwardsPageTransition AnimatedBuilder RepaintBoundary FocusTrap _FocusMarker 语义 FocusScope PrimaryScrollController _ActionsMarker Actions Builder PageStorage Offstage _ModalScopeStatus UnmanagedRestorationScope RestorationScope AnimatedBuilder _ModalScope-[LabeledGlobalKey<_ModalScopeState>#c4e87] 语义 _EffectiveTickerMode TickerMode _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryState>
import 'package:flutter/material.dart';
import './widgets/new_transaction.dart';
import './widgets/transaction_list.dart';
import './models/transaction.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter App',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final List<Transaction> _userTransactions = [
Transaction(
id: 't1',
title: 'New Shoes',
amount: 60.32,
date: DateTime.now(),
),
Transaction(
id: 't2',
title: ' Weekly Groceriese',
amount: 10.22,
date: DateTime.now(),
),
];
void _addNewTransaction(String txTitle, double txAmount) {
final newTx = Transaction(
title: txTitle,
amount: txAmount,
date: DateTime.now(),
id: DateTime.now().toString(),
);
setState(() {
_userTransactions.add(newTx);
});
}
void _startNewTransaction(BuildContext ctx) {
showBottomSheet(
context: ctx,
builder: (_) {
return GestureDetector(
onTap: () {},
child: NewTransaction(_addNewTransaction),
behavior: HitTestBehavior.opaque,
);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter App'),
actions: <Widget>[
IconButton(
onPressed: () => _startNewTransaction(context),
icon: Icon(Icons.add),
),
],
),
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Container(
width: double.infinity,
child: Card(
color: Colors.blue,
elevation: 5,
child: Text('Chart !'),
),
),
TransactionList(_userTransactions),
],
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: FloatingActionButton(
onPressed: () => _startNewTransaction(context),
child: Icon(Icons.add),
),
);
}
}
我也通过使用 Scaffold.of(ctx).showBottomSheet 尝试过这种方式,但它给了我一些我不明白的错误
解决方案
尝试:showModalBottomSheet
改为。
或者,如果您想使用,showBottomSheet
那么这是一种解决方法。
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter App',
home: Scaffold(body: MyHomePage()),
);
}
}
class MyHomePage extends StatefulWidget {
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
void _startNewTransaction(BuildContext ctx) {
showBottomSheet(
context: ctx,
builder: (_) {
return GestureDetector(
onTap: () {},
child: Container(),
behavior: HitTestBehavior.opaque,
);
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter App'),
actions: <Widget>[
IconButton(
onPressed: () => _startNewTransaction(context),
icon: Icon(Icons.add),
),
],
),
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Container(
width: double.infinity,
child: Card(
color: Colors.blue,
elevation: 5,
child: Text('Chart !'),
),
),
],
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: FloatingActionButton(
onPressed: () => _startNewTransaction(context),
child: Icon(Icons.add),
),
);
}
}
推荐阅读
- javascript - 在 JavaScript OOP 中使用“this”关键字来引用方法是不好的做法吗?
- python - Python 回复收到此错误的 gmail 消息:AttributeError: 'int' object has no attribute 'encode'
- c# - 如何摆脱dbo。从通过代码首先创建的主键、外键和索引名称?
- coldfusion - 如何将 localhost:8500 更改为 Coldfusion 中的其他内容
- node.js - 如何使用猫鼬填充获取另一个集合数据
- asp.net-core - 具有失败要求的基于策略的授权的结果
- vhdl - 如何修复 VHDL 中的“U”输出
- javascript - 如何确定所选文本是否在 HTML 文本节点中的花括号内
- go - 用于谷歌云存储的 Golang SDK:分段下载
- javascript - 如何使用 tronweb 获取 tronlink 中的当前活动帐户?