Flutter / Dart:调用了onPressed()按钮,但屏幕未重绘?

时间:2018-11-17 16:41:09

标签: android button dart flutter

我试图让按钮在按下时更改其文本。我通过使用setState()更改了传递给按钮的Text子代的字符串的值来完成此操作。我尝试更改的文本的按钮是forgotLabel-在下面的代码中找到。

我尝试使用不同的按钮类型,例如FlatButton和RaisedButton,它们都导致相同的问题:按下按钮,调用setState并更改表示按钮中文本的字符串的值(称为forgotText在代码中),但该按钮似乎没有视觉上的变化。这是代码:

import 'package:flutter/material.dart';
import 'package:mobileapp/home_page.dart';

class LoginPage extends StatefulWidget {
  static String tag = 'login-page';
  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  @override
  Widget build(BuildContext context) {
final bgGrey = Color(0xFF1c232c);

//Company logo at top
final logo = Hero(
  tag: 'hero',
  child: CircleAvatar(
    backgroundColor: Colors.transparent,
    radius:68.0,
    child: Image.asset('assets/logo_transparent.png'),
  ),
);

//Email field
final email = TextFormField(
  keyboardType: TextInputType.emailAddress,
  autofocus: false,
  initialValue: 'jonDoe@domain.com',  //remove later
  style: TextStyle(color: Colors.white70),
  decoration: InputDecoration(
    hintText: 'Email',
    contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
    enabledBorder: OutlineInputBorder(
      borderRadius: BorderRadius.circular(32.0),
      borderSide: BorderSide(color: Colors.white)
      )
  ),
);

//Password field
final password = TextFormField(
  autofocus: false,
  initialValue: 'verysafePassword',   //remove later
  obscureText: true,
  style: TextStyle(color: Colors.white70),
  decoration: InputDecoration(
    hintText: 'Password',
    contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
    enabledBorder: OutlineInputBorder(
      borderRadius: BorderRadius.circular(32.0),
      borderSide: BorderSide(color: Colors.white)
      )
  ),
);

// Login button
final loginButton = Padding(
  padding: EdgeInsets.symmetric(vertical: 20.0),
  child: Material(
    borderRadius: BorderRadius.circular(30.0),
    color: Colors.deepOrangeAccent,
    shadowColor: Colors.deepOrange[300],
    elevation: 5.0,
    child: MaterialButton(
      minWidth: 200.0,
      height: 30.0,
      onPressed: () {
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => HomePage()),
        );
      },
      child: Text('Login', style: TextStyle(color: Colors.white70),),
    ),
  )
);

String forgotText = "Forgot Password";
void changeText() {
   setState(() =>forgotText = "Please use the web app to reset your password.");
}

// Forgot password button
final forgotLabel = MaterialButton(
  child: Text(
    forgotText,
    style: TextStyle(color: Colors.white70),
  ),
  onPressed: changeText,
);

//Layout settings for each widget made 
//Contains: logo, email, password, loginButton and forgotLabel
return Scaffold(
  backgroundColor: bgGrey,    //defined under method declaration
  body: Center(
    child: ListView(
      shrinkWrap: true,
      padding: EdgeInsets.only(left: 24.0, right: 24.0),
      children: <Widget>[
        logo,
        SizedBox(height: 48.0),
        email,
        SizedBox(height: 8.0),
        password,
        SizedBox(height: 25.0),
        loginButton,
        forgotLabel
      ],
    ),
  ),
);
}
}

1 个答案:

答案 0 :(得分:1)

问题是调用forgotTextsetState被更改了,但是由于它被定义为build()中的局部变量,因此它再次被初始化为Forgot Password。将其设置为_LoginPageState的实例变量。