Navigator.pop() - 如何传递 `context` 以供导航器读取 -

Navigator.pop() - How to pass `context` to be read by the navigator -

我正在学习 flutter 教程,

在这个小部件中,为了使其在输入数据后消失,我将调用导航器 class, 但在本教程中,我必须将无状态小部件转换为有状态小部件,尽管我不需要它。

我可以将 : 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,
            )
          ],
        ),
      ),
    );
  }
}

使用无状态小部件时,您无法在构建方法之外访问 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 中。

喜欢下面的代码:

onPressed: (){
if (titleController.text.isEmpty || double.parse(amountController.text) <= 0 ){

  return;
}
    Navigator.of().pop();

    addNEW(
      titleController.text,
      double.parse(amountController.text),
    );
}

希望对您有所帮助