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: (_) =&gt; submitData(context)

以上是关于Navigator.pop() - 如何传递 `context` 以供导航器读取 -的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Navigator.pop 再次运行小部件构建方法

运行 navigator.pop() 后如何刷新 React 状态?

Flutter - 从 AppBar 返回上一页不会刷新页面,使用 Navigator.pop(context)

如何在 Flutter 中的 navigator.pop(context) 之后显示小吃栏?

React Native:在 Navigator Pop 上更改组件(文本)

如何在 Navigator.Pop 或 Push 中刷新状态