Navigator.pop () - Как передать `context` для чтения навигатором - - PullRequest
0 голосов
/ 08 мая 2020

Я следую руководству по флаттеру ,,

, и в этом виджете, чтобы он исчез после ввода данных, я назову класс навигатора, но в этом руководстве мне придется преобразовать виджет без состояния на виджет с сохранением состояния, хотя он мне не нужен.

Как я могу использовать: 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 Ответ

3 голосов
/ 08 мая 2020

При использовании виджета без сохранения состояния вы не можете получить доступ к Context вне метода сборки. Чтобы устранить ошибку, вы можете выполнить одно из следующих действий: 1) Преобразуйте ваш Stateless widget в Stateful widget

OR

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),
    );
}

Надеюсь, это поможет

...