我正在尝试设置一组非常简单的单选按钮,这就是为什么令人沮丧的是它们无法正常工作。我试过在类似的类(class)中设置它,并且成功了。我知道正在调用 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(),
);
}
}
最佳答案
问题是因为您在 build 方法中定义了变量 subscriberValue。您正在使用 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;
});
}
}
关于 flutter radio 值不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54957183/
我正在处理一系列midi音高,看起来像这样......pitches=[60,nil,nil,nil,67,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil]在这种情况下,索引1、2和3上的间距仍然是60。索引4之后,音高仍然是67。如何编写一个方法来识别先前的非零值?目前我能想到的唯一方法看起来有点笨拙:defpitch_at_step(pitches,step)ifpitches.any?x=pitches[step]
加州意识形态的先知们认为,只有自由市场和全球通信的控制论流和混沌漩涡才能决定未来。因此,政治辩论是一种浪费。作为自由主义者,他们断言由民主政府所调解的人民意志是一种危险的异端邪说,它妨碍了自然而有效地积累财产的自由。作为技术决定论者,他们相信人类社会和情感纽带阻碍了机器的有效进化。放弃了民主和社会团结,加州意识形态梦想着一个数字天堂,只由自由精神人格者栖居着。——安迪·卡梅伦和理查德·巴布鲁克,“加州意识形态”随着全球社会的兴起,我们正在经历的混乱中,声誉已经失去了很多意义。随着旧机构的倒台,在垂死的领域中的人们有一种甩卖心态,他们利用前几代人建立的声誉获利。由于我们的政治制度失败,政客们表现
我希望Nokogiri保持HTML实体不变,但它似乎正在将实体转换为实际符号。例如:Nokogiri::HTML.fragment('®').to_s结果:"®"似乎没有任何东西可以将原始HTML返回给我。.inner_html、.text、.content方法都返回'®'而不是'®'有没有办法让Nokogiri保持这些HTML实体不变?我已经搜索过stackoverflow并找到了类似的问题,但没有一个与这个问题完全相同。 最佳答案 这不是一个理想的答案,但您可以通过设置允许的编码来强制它生成实体(如果不是好听的名
我想将一个对象从一个组(或世界/场景)移动到另一个组,但要保持其全局转换不变。基本上,我不想看到对象发生变化。基本上,是这样的://storecurrentworldtransformationvarorigWorldMatrix=myObject.matrixWorld.clone();//moveobjecttoagroup(thatispositionedandrotatedarbitrarily)someGroup.add(myObject);//restorepreviousworldtransformationmyObject.matrixWorld.copy(origWo
我设置了一个简单的测试文件,几乎与create-react-app使用的文件相同:App.test.jsimportReactfrom'react';importReactDOMfrom'react-dom';import{App}from'./App';it('renderswithoutcrashing',()=>{constdiv=document.createElement('div');ReactDOM.render(,div);});当我运行yarntest我不断收到此错误消息:InvariantViolation:Couldnotfind"store"ineitherth
我有以下JavaScript数组:vardays=[{"day":"sunday","morning":"geschlossen",},{"day":"monday","morning":"geschlossen",},{"day":"tuesday","morning":"geschlossen",},{"day":"wenesday","morning":"geschlossen",},{"day":"thursday","morning":"16:30-19:00Uhr",},{"day":"friday","morning":"09:00-18:00Uhr",},{"day":
我有一个网格,它被设计成固定的宽度和高度。请参见下图。此网格必须适用于所有屏幕尺寸,同时使网格中的元素保持在相同的位置。我的代码目前根据设计的原始宽度/高度调整这些元素的大小,并使其适应新的宽度/高度。尽管在下面的示例中它们没有正确定位,但计算确实有效。我遇到的困难是,我需要将504x504的中心网格图block设为静态,并考虑到这一点调整其他图block。目前所有元素,包括中间的调整,我只想停止调整中间的元素,而其他元素则删除/添加差异到它们的宽度/高度。这很难解释,如果我可以添加更多详细信息,请告诉我。constinitalWidth=1043;constinitialHeight
有谁知道一些技巧如何做到这一点?我尝试使用try-catch:"usestrict";consta=20;varisConst=false;try{vartemp=a;a=a+1;a=temp;}catch(e){isConst=true;}但不幸的是,它只能在“严格”模式下工作。如果不使用“usestrict”,它会静默执行所有语句,而不会修改a。此外,我无法将此代码包装到一些方便的函数中(例如isConstant(someConst)),因为我将传递给该函数的任何参数都将是一个新变量。所以有人知道如何创建isConstant()函数吗? 最佳答案
我在这里主要想完成的是合并这两个教程(x)(x)为了创建一个具有自定义图标的简单TabBar。我正在尝试使用react-native-vector-icons库中的图标,我已将其添加到我的节点模块中。但是,我遇到了一个障碍:InvariantViolation:Elementtypeisinvalid:expectedastring(forbuilt-in>components)oraclass/function(forcompositecomponents)butgot:undefined.Youlikelyforgottoexportyourcomponentfromthefile
我一直在尝试让它工作一段时间,但不确定如何执行以下操作。我的表单组件有包含常规html标记和输入的子组件。如果child是输入,我想添加attachToForm和detachFromForm函数。如果它不是输入,我想继续遍历子项以确保该元素没有子输入字段。无论该元素是否是输入,我仍然希望它出现在我的页面上,我只是想将功能添加到输入。问题是我只能让我的函数只返回输入,删除标签和标题。我知道那是因为我只向newChildren添加带有输入的元素,但是如果我将其他元素推送到elseif部分,我会得到重复项,我可以想到另一种方法来执行此操作。我不确定我是不是不了解基本的JS还是脑子有问题。Re