Flutter重定向textFormField打开

时间:2019-03-04 04:54:38

标签: flutter

每当我单击textFormField时,键盘几乎立即打开和关闭,我认为这有点刷新了页面。我有另一页的表单,我没有遇到这个问题。 这是该页面的代码,我在应用程序中使用的另一种形式与此页面几乎相同

import 'package:flutter/material.dart';
import 'package:scoped_model/scoped_model.dart';

import '../scoped_models/products.dart';

class ProductAdd extends StatelessWidget {
  final _formData = {
    'title': null,
    'description': null,
    'price': null,
    'image': 'assets/food.jpg'
  };
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();

  Widget _titleField() {
    return TextFormField(
      decoration: InputDecoration(labelText: 'Enter Title'),
      keyboardType: TextInputType.text,
      validator: (String value) {
        if (value.isEmpty) {
          return 'Please enter a valid title';
        }
      },
      onSaved: (value) {
        print(value);
        _formData['title'] = value;
      },
    );
  }

  Widget _descriptionField() {
    return TextFormField(
      decoration: InputDecoration(labelText: 'Enter Description'),
      keyboardType: TextInputType.text,
      validator: (String value) {
        if (value.isEmpty) {
          return 'Please enter a valid description';
        }
      },
      onSaved: (value) {
        print(value);
        _formData['description'] = value;
      },
    );
  }

  Widget _priceField() {
    return TextFormField(
      decoration: InputDecoration(labelText: 'Enter Price'),
      keyboardType: TextInputType.number,
      validator: (String value) {
        if (value.isEmpty) {
          return 'Please enter a valid price';
        }
      },
      onSaved: (value) {
        print(value);
        _formData['price'] = value;
      },
    );
  }

  Widget _submitButton(context) {
    return RaisedButton(
      textColor: Colors.white,
      child: Text('LOGIN'),
      onPressed: () {
        if (!_formKey.currentState.validate()) {
          return;
        }
        _formKey.currentState.save();
        Navigator.pushReplacementNamed(context, '/products');
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return ScopedModelDescendant<ProductsModel>(
      builder: (context, child, ProductsModel model) {
        return Container(
          child: Center(
            child: Container(
              child: SingleChildScrollView(
                child: Container(
                  padding: EdgeInsets.all(20.0),
                  child: Form(
                    key: _formKey,
                    child: Column(
                      children: <Widget>[
                        _titleField(),
                        _descriptionField(),
                        _priceField(),
                        SizedBox(
                          height: 10.0,
                        ),
                        _submitButton(context)
                      ],
                    ),
                  ),
                ),
              ),
            ),
          ),
        );
      },
    );
  }
}

我正在使用Flutter版本:1.0.0

2 个答案:

答案 0 :(得分:0)

我无法重现该问题。我重新创建了您的保护套,键盘工作正常。我虽然跳过了代码的scoped-model部分,因为我不知道您的设置如何。但是用最少的代码,我无法复制它。见下文:

import 'package:flutter/material.dart';
import 'package:scoped_model/scoped_model.dart';

//import '../scoped_models/products.dart';

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

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
        return MaterialApp(
          home: ProductAdd(),
        );
  }
}

class ProductAdd extends StatelessWidget {
  final _formData = {
    'title': null,
    'description': null,
    'price': null,
    'image': 'assets/food.jpg'
  };
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();

  Widget _titleField() {
    return TextFormField(
      decoration: InputDecoration(labelText: 'Enter Title'),
      keyboardType: TextInputType.text,
      validator: (String value) {
        if (value.isEmpty) {
          return 'Please enter a valid title';
        }
      },
      onSaved: (value) {
        print(value);
        _formData['title'] = value;
      },
    );
  }

  Widget _descriptionField() {
    return TextFormField(
      decoration: InputDecoration(labelText: 'Enter Description'),
      keyboardType: TextInputType.text,
      validator: (String value) {
        if (value.isEmpty) {
          return 'Please enter a valid description';
        }
      },
      onSaved: (value) {
        print(value);
        _formData['description'] = value;
      },
    );
  }

  Widget _priceField() {
    return TextFormField(
      decoration: InputDecoration(labelText: 'Enter Price'),
      keyboardType: TextInputType.number,
      validator: (String value) {
        if (value.isEmpty) {
          return 'Please enter a valid price';
        }
      },
      onSaved: (value) {
        print(value);
        _formData['price'] = value;
      },
    );
  }

  Widget _submitButton(context) {
    return RaisedButton(
      textColor: Colors.white,
      child: Text('LOGIN'),
      onPressed: () {
        if (!_formKey.currentState.validate()) {
          return;
        }
        _formKey.currentState.save();
        Navigator.pushReplacementNamed(context, '/products');
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          child: SingleChildScrollView(
            child: Container(
              padding: EdgeInsets.all(20.0),
              child: Form(
                key: _formKey,
                child: Column(
                  children: <Widget>[
                    _titleField(),
                    _descriptionField(),
                    _priceField(),
                    SizedBox(
                      height: 10.0,
                    ),
                    _submitButton(context)
                  ],
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

我的Flutter版本:0.11.10

答案 1 :(得分:0)

这是我的更正,希望它能起作用;你需要添加TextEditingController titlecontroller到TextFormField,不要使用onsaved();并在commitbutton功能上使用以下命令:

  TextEditingController _pricecontroller;
 Widget _priceField() {
    return TextFormField(
//addcontroller;
controller : __pricecontroller
      decoration: InputDecoration(labelText: 'Enter Price'),
      keyboardType: TextInputType.number,
      validator: (String value) {
        if (value.isEmpty) {
          return 'Please enter a valid price';
        }
      },
      onSaved: (value) {
        print(value);
        _formData['price'] = value;
      },
    );
  }

 Widget _submitButton(context) {
    return RaisedButton(
      textColor: Colors.white,
      child: Text('LOGIN'),
      onPressed: () {
        if (!_formKey.currentState.validate()) {
            _formKey.currentState.save();
        _formData['title'] = __titlecontroller.text;
        _formData['description'] = __desccontroller.text;
        _formData['price'] = __pricecontroller.text;
        }
        Navigator.pushReplacementNamed(context, '/products');
      },
    );
  }