Navigator.pop() - 如何传递 `context` 以供导航器读取 -
Posted
技术标签:
【中文标题】Navigator.pop() - 如何传递 `context` 以供导航器读取 -【英文标题】:Navigator.pop() - How to pass `context` to be read by the navigator - 【发布时间】:2020-08-23 23:31:22 【问题描述】:我正在关注一个颤振教程,,
在这个小部件中,为了让它在输入数据后消失,我将调用导航器类,, 但在本教程中,我必须将无状态小部件转换为有状态小部件,尽管我不需要它。
我可以将Navigator.of(context).pop();
与我的无状态小部件一起使用而不会出现未定义上下文的错误吗?
- 如何通过context
被导航器读取
代码:
import 'package:flutter/material.dart';
class NewTransaction extends StatelessWidget
final titleController = TextEditingController();
final amountController = TextEditingController();
final Function addNEW;
NewTransaction(this.addNEW);
void submitData()
if (titleController.text.isEmpty || double.parse(amountController.text) <= 0 )
return;
Navigator.of().pop();
addNEW(
titleController.text,
double.parse(amountController.text),
);
@override
Widget build(BuildContext context)
return Card(
elevation: 5,
child: Container(
padding: EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
TextField(
decoration: InputDecoration(labelText: 'Title'),
controller: titleController,
onSubmitted: (_) => submitData(),
),
TextField(
decoration: InputDecoration(labelText: 'Amount'),
keyboardType: TextInputType.numberWithOptions(decimal: true),
controller: amountController,
onSubmitted: (_) => submitData(),
),
FlatButton(
child: Text('Add Transaction'),
onPressed: submitData,
)
],
),
),
);
【问题讨论】:
【参考方案1】:使用无状态小部件时,您无法在构建方法之外访问Context
。
要解决该错误,您可以执行以下操作之一:
1) 将您的Stateless widget
转换为Stateful widget
或
2) 将上下文作为参数传递给submitdata
函数。就像下面的代码:
void submitData(BuildContext context)
if (titleController.text.isEmpty || double.parse(amountController.text) <= 0 )
return;
Navigator.of().pop();
addNEW(
titleController.text,
double.parse(amountController.text),
);
所以当在FlatButton
中使用它时,它会像下面这样:
onPressed: submitdata(context),
3) 将submitdata
函数的主体直接放在onPressed
of you 按钮中。
喜欢下面的代码:
onPressed: ()
if (titleController.text.isEmpty || double.parse(amountController.text) <= 0 )
return;
Navigator.of().pop();
addNEW(
titleController.text,
double.parse(amountController.text),
);
希望对你有帮助
【讨论】:
也可以将上下文作为参数传递void submitData(BuildContext context)
然后onSubmitted: (_) => submitData(context)
以上是关于Navigator.pop() - 如何传递 `context` 以供导航器读取 -的主要内容,如果未能解决你的问题,请参考以下文章
Flutter Navigator.pop 再次运行小部件构建方法
运行 navigator.pop() 后如何刷新 React 状态?
Flutter - 从 AppBar 返回上一页不会刷新页面,使用 Navigator.pop(context)
如何在 Flutter 中的 navigator.pop(context) 之后显示小吃栏?