扑动的无线电值不变

问题描述 投票:0回答:1

我正试图让一组非常简单的无线电按钮上升,这就是为什么它们如此令人沮丧以至于它们无法正常工作。我已尝试在类似的课程中进行设置,并且它有效。我知道setstate被调用的事实,但由于某种原因,它不会更新单个单选按钮。这让我觉得这是一个与国家有关的奇怪问题。

无论如何,所有的帮助将不胜感激。我的主要课程是下面代码的第二部分。

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../bloc/thembloc.dart';
import './components/textfield.dart';

class SignUp extends StatefulWidget {
  @override
  _SignUpState createState() => _SignUpState();
}

class _SignUpState extends State<SignUp> {

  /*
  ui for signup
  includes multiple textfields.
  includes all of the information that we'll need
  to collect for an user to register an account. 
  todo: wrap everything in a form, encrypt it and send it to a private server.
  */
  @override
  Widget build(BuildContext context) {
    double _height = MediaQuery.of(context).size.height;
    double _width = MediaQuery.of(context).size.width;
    final double _margin = 16.0;
    final double _promptWidth = _width - 32.0;
    final double _promptHeight = _height - 32.0;
    final double _textFieldWidth = _promptWidth - 32.0;
    int subscriberValue;

    void switchSubscriber(int value) {
      setState(() {
       subscriberValue = value; 
      });
    }

    return BlocBuilder(
        bloc: BlocProvider.of<ThemeBloc>(context),
        builder: (context, ThemeState state) {
          return Scaffold(
            resizeToAvoidBottomInset: false,
            resizeToAvoidBottomPadding: false,
            appBar: AppBar(
              centerTitle: true,
              title: Text(
                "smartmoney",
                style: BlocProvider.of<ThemeBloc>(context).currentState.themedata.primaryTextTheme.display2,
              ),

              // appbar
              shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.only(
                      bottomLeft: Radius.circular(8.0),
                      bottomRight: Radius.circular(8.0))),
              leading: IconButton(
                icon: Icon(
                  Icons.arrow_back,
                  color: BlocProvider.of<ThemeBloc>(context).currentState.themedata.buttonColor,
                ),
                onPressed: () {
                  print("going back");
                },
              ),
              backgroundColor: BlocProvider.of<ThemeBloc>(context).currentState.themedata.canvasColor,
            ),
            body: Container(
              height: _height,
              width: _width,
              color: BlocProvider.of<ThemeBloc>(context).currentState.themedata.backgroundColor,
              child: Column(
                children: <Widget>[
                  Padding(
                    padding: EdgeInsets.only(top: _margin),
                    child: Container(
                      decoration: BoxDecoration(
                         borderRadius: BorderRadius.all(Radius.circular(8.0)),
                         color: BlocProvider.of<ThemeBloc>(context).currentState.themedata.canvasColor,
                         boxShadow: [
                           BoxShadow(
                               spreadRadius: 0.0,
                               color: Colors.black38,
                               blurRadius: 6.0,
                               offset: Offset(0.0, 3.0)),
                         ]),
                      width: _promptWidth,
                      height: _promptHeight - 48 - _margin,
                      child: Column(
                        children: <Widget>[
                          Text("Let's get started",
                          style: BlocProvider.of<ThemeBloc>(context).currentState.themedata.primaryTextTheme.display2,
                          ),
                          Text("Enter your information to create an account",
                          style: BlocProvider.of<ThemeBloc>(context).currentState.themedata.primaryTextTheme.subtitle,
                          ),
                          Padding(
                            padding: EdgeInsets.only(top: 8.0),
                            child: StyledTextField(
                              textFieldWidth: _textFieldWidth,
                              helperText: "First name",
                            ),
                          ),
                          Padding(
                            padding: EdgeInsets.only(top: 8.0),
                            child: StyledTextField(
                              textFieldWidth: _textFieldWidth,
                              helperText: "Last name",
                            ),
                          ),
                          Padding(
                            padding: EdgeInsets.only(top: 8.0),
                            child: StyledTextField(
                              textFieldWidth: _textFieldWidth,
                              helperText: "Email",
                            ),
                          ),
                          Padding(
                            padding: EdgeInsets.only(top: 8.0),
                            child: StyledTextField(
                              textFieldWidth: _textFieldWidth,
                              helperText: "Password",
                            ),
                          ),
                          Padding(
                            padding: EdgeInsets.only(top: 8.0),
                            child: StyledTextField(
                              textFieldWidth: _textFieldWidth,
                              helperText: "Phone number",
                            ),
                          ),
                          Text("Subscriber type",
                          style: BlocProvider.of<ThemeBloc>(context).currentState.themedata.primaryTextTheme.display1,
                          ),
                          Radio(
                            groupValue: subscriberValue,
                            value: 0,
                            onChanged: (int value) => switchSubscriber(value),
                          ),
                          Radio(
                            groupValue: subscriberValue,
                            value: 1,
                            onChanged: (int value) => switchSubscriber(value),
                          )
                        ],
                      ),
                    ),
                  )
                ],
              ),
          ),
          );
        });
  }
}

import 'package:flutter/material.dart';
import './bloc/thembloc.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'ui/signin.dart';
import 'ui/signup.dart';
import 'ui/onboarding.dart';
import './ui/testing/whatthefuck.dart';

void main() {
  runApp(
    MaterialApp(
      home: SmartMoney(),
    )
    // SmartMoney()
  );
}

class SmartMoney extends StatefulWidget {
  @override
  _SmartMoneyState createState() => _SmartMoneyState();
}

class _SmartMoneyState extends State<SmartMoney> {

  final _themeBloc = ThemeBloc();

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
        bloc: _themeBloc,
        child: SignUp(),
      );
  }
}
flutter
1个回答
2
投票

问题是因为您在subscriberValue方法中定义了变量build。你正在使用召唤setState方法的build调用,并且在每次召回build时你都失去了subscriberValue的价值。我建议你总是使用变量来控制你的小部件的状态作为类成员。

class _SignUpState extends State<SignUp> {

  // HAS TO BE CLASS MEMBER AND IT'S GOOD AN INITIAL VALUE TOO..
  int subscriberValue =1; // asuming that  1 is default radio button option 

  @override
  Widget build(BuildContext context) {
    //... some codes ...
    //int subscriberValue; REMOVE THIS LINE. YOU'RE LOSING THE VALUE IN EVERY setState call

    //You can define this method outside from build too.
    void switchSubscriber(int value) {
      setState(() {
        subscriberValue = value;
      });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.