从Flutter中的弹出式导航器接收响应 [英] Receive Response from pop navigator in Flutter

查看:72
本文介绍了从Flutter中的弹出式导航器接收响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是导航器为称为的表单推送的简单代码示例.并弹出一个答案.我的目标是弹出一个对象,而不是字符串,但保持其简单性仍然行不通.

Here is a simple example of code that navigator push for a form called. and pop for an answer. my goal is to make a pop of an object, not a string, but keeping it that simple still doesn't work.

main.dart:

main.dart:

import 'package:flutter/material.dart';

import 'answer.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final appTitle = 'Form Validation Demo';

    return MaterialApp(
      title: appTitle,
      home: Scaffold(
        appBar: AppBar(
          title: Text(appTitle),
        ),
        body: ShowData(),
      ),
    );
  }
}

// Create a Form widget.
class MyCustomForm extends StatefulWidget {
  @override
  MyCustomFormState createState() {
    return MyCustomFormState();
  }
}

// Create a corresponding State class.
// This class holds data related to the form.
class MyCustomFormState extends State<MyCustomForm> {
  // Create a global key that uniquely identifies the Form widget
  // and allows validation of the form.
  //
  // Note: This is a GlobalKey<FormState>,
  // not a GlobalKey<MyCustomFormState>.
  final _formKey = GlobalKey<FormState>();
  final myController = TextEditingController();
  String stateData;
  @override
  void dispose() {
    // Clean up the controller when the widget is disposed.
    myController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // Build a Form widget using the _formKey created above.
    return Scaffold(
      body: Form(
        key: _formKey,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextFormField(
              controller: myController,
              validator: (value) {
                if (value.isEmpty) {
                  return 'Please enter some text';
                }
                return null;
              },
              onSaved: (value){
                stateData = value;
              },
            ),
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 16.0),
              child: RaisedButton(
                onPressed: () {
                  // Validate returns true if the form is valid, or false
                  // otherwise.
                  if (_formKey.currentState.validate()) {
                    _formKey.currentState.save();
                    // If the form is valid, display a Snackbar.
                    Navigator.pop(context,stateData);
//                  Scaffold.of(context)
//                      .showSnackBar(SnackBar(content: Text(myController.text)));
//                    myController.text = 'look at me';
                  }
                },
                child: Text('Submit'),
              ),
            ),
          ],
        ),
      ),
    );
  }

}

answer.dart:

answer.dart:

import 'package:flutter/material.dart';

import 'main.dart';

class ShowData extends StatefulWidget {

  @override
  _ShowDataState createState() => _ShowDataState();
}

class _ShowDataState extends State<ShowData> {
  String data = 'start';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        floatingActionButton: FloatingActionButton(onPressed: (){
          String holder =  getFormData(context);
          setState(() {
            data = holder;
          });
        },
        elevation: 4,

        ),
        body:Text(data,style: TextStyle(fontSize: 80),));
  }

  String getFormData(BuildContext context) {
    final Future<String> answer =  Navigator.push(context,MaterialPageRoute(builder: (context)=>MyCustomForm()));
    answer.then((String value) {
        return value != null? value: 'empty';
      }
    );
  }
}

从表单错误消息返回时:

when returning from the form error message is :

'package:flutter/src/widgets/text.dart':断言失败:行...pos ...'data!= null':必须为文本提供非null的字符串小部件.

'package:flutter/src/widgets/text.dart': Failed assertion: line ... pos... 'data!=null': A non-null String must be provided to a Text widget.

推荐答案

添加等待以接收来自Future的结果并返回值;

Add await to receive the result from Future and return the value;

   Future<String> getFormData(BuildContext context) async {
    final result = await Navigator.push(
        context, MaterialPageRoute(builder: (context) => MyCustomForm()));
    return Future.value(result);
  }

修改 FloatingActionButton onPressed代码以接收将来的字符串

Modify the FloatingActionButton onPressed code to receive Future String

onPressed: () async {
            final value = await getFormData(context);
            setState(() {
              data = value;
            });
          },

这篇关于从Flutter中的弹出式导航器接收响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆