Flutter 滑块(在自定义类中创建)未移动或更新
我刚刚开始使用flutter开发android应用程序,我正在学习 有关当前项目的详细信息: 我正在创建一个骰子模拟器,用户可以点击绘制的骰子来掷骰子。我添加了振动效果,还有吐司。现在我想让用户使用滑块修改骰子的大小 我在文档中发现了一个错误。 我还参考了stackoverflow中的thread。不过,我还是不能完全理解这个概念。我将感谢任何帮助 问题: 所说的滑块确实呈现了它应该是什么样子,但我似乎无法拖动它 主飞镖Flutter 滑块(在自定义类中创建)未移动或更新,flutter,slider,Flutter,Slider,我刚刚开始使用flutter开发android应用程序,我正在学习 有关当前项目的详细信息: 我正在创建一个骰子模拟器,用户可以点击绘制的骰子来掷骰子。我添加了振动效果,还有吐司。现在我想让用户使用滑块修改骰子的大小 我在文档中发现了一个错误。 我还参考了stackoverflow中的thread。不过,我还是不能完全理解这个概念。我将感谢任何帮助 问题: 所说的滑块确实呈现了它应该是什么样子,但我似乎无法拖动它 主飞镖 导入“包装:颤振/材料.省道”; 导入“package:do_dice/d
导入“包装:颤振/材料.省道”;
导入“package:do_dice/dice2D.dart”;
导入“包:flifter/services.dart”;
进口“包装:fluttoast/fluttoast.dart”;
void showToastText(int a){
烤面包
.cancel();//清除所有计划的toast调用;这将使toast cal看起来即时响应。
烤面包片(
味精:“$a”,
烤面包片长度:烤面包片长度,
重力:ToastGravity.BOTTOM,
背景颜色:Colors.black87,
textColor:Colors.yellow,
字体大小:14.0,
);
}
void main(){
SystemChrome.SetSystemTimeOverlayStyle(
系统样式(
statusBarColor:Color.fromRGBO(0,0,0,0.0),//状态栏是透明的
),
);
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“掷骰子”,
主题:主题数据(
亮度:亮度。暗,
),
主页:我的主页(标题:“掷骰子”),
debugShowCheckedModeBanner:false,
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
Dice2D dice1=新Dice2D(
尺寸:300.0,
边框宽度:5.0,
displayInt:2,
);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:中心(
子:文本(
widget.title,
)),
),
正文:专栏(
儿童:[
滑块尺寸(
最小值:100.0,
最大值:300.0,
标题:“设置骰子大小:”,
骰子:骰子1,
标题颜色:颜色。黄色,
),
SliderOrderWidth(标题颜色:Colors.yellow,标题:“设置骰子的边框宽度:”,骰子:骰子1,最小值:1.0,最大值:10.0,),
已展开(子对象:中心(子对象:1)),
],
),
浮动操作按钮:浮动操作按钮(
已按下:(){
//函数将骰子上的数字显示为土司
showToastText(dice1.getDisplay());
},
背景颜色:Colors.yellow,
工具提示:“显示数字。”,
子:图标(Icons.message),
),
);
}
}
掷骰子
导入“包装:颤振/材料.省道”;
导入“dart:math”;
进口“包装:fluttoast/fluttoast.dart”;
进口“包装:振动/振动.省道”;
无效滚动(){
振动。取消();
振动。振动(持续时间:50);//默认值为500毫秒
}
闲逛{
烤面包
.cancel();//清除所有计划的toast调用;这是为了使toast调用看起来是即时响应的。
烤面包片(
收到,
烤面包片长度:烤面包片长度,
重力:ToastGravity.BOTTOM,
背景颜色:Colors.black87,
textColor:Colors.white70,
字体大小:14.0,
);
}
类paintDice2D扩展了无状态小部件{
@凌驾
@必需的
最终整型显示;
@必需的
最终双边界宽度;
@必需的
最后的颜色;
@必需的
最终双骰子大小;
颜料盒2D(
{Key Key,this.diceSize,this.display,this.borderWidth,this.diceColor})
:super(key:key);
小部件抽屉盒(){
返回中心(
子级:容器(),
);
}
小部件drawCircleDot(){
返回中心(
子:容器(
装饰:框装饰(形状:BoxShape.circle,颜色:diceColor),
),
);
}
小部件构建(构建上下文){
双divSize=(diceSize-2*边框宽度)/3;
返回容器(
装饰:盒子装饰(
borderRadius:borderRadius.all(半径圆形(10.0)),
边界:边界(
颜色:dice颜色,宽度:borderWidth,样式:BorderStyle.solid),
),
身高:身高,
宽度:骰子大小,
孩子:排(
儿童:[
纵队(
儿童:[
容器(
宽度:divSize,
身高:身高,
填充:所有边缘设置(分区大小/5),
子:(显示==3)||
显示==4||
显示==5||
显示==6)==
真的
?drawCircleDot()
:paumptybox(),//条件==true?{code for true}:{code for false}
),
容器(
宽度:divSize,
身高:身高,
填充:所有边缘设置(分区大小/5),
儿童:
(显示==6)==true?drawCircleDot():drawEmptyBox(),
),
容器(
宽度:divSize,
身高:身高,
填充:所有边缘设置(分区大小/5),
子:(显示==2)||
显示==4||
显示==5||
显示==6)==
真的
?drawCircleDot()
:dramptybox(),
),
],
),
纵队(
儿童:[
import 'package:flutter/material.dart';
import 'package:do_dice/dice2D.dart';
import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart';
void showToastText(int a) {
Fluttertoast
.cancel(); //to clear all scheduled toast call ; this is to make the toast cal seem instant responsive.
Fluttertoast.showToast(
msg: '$a',
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.black87,
textColor: Colors.yellow,
fontSize: 14.0,
);
}
void main() {
SystemChrome.setSystemUIOverlayStyle(
SystemUiOverlayStyle(
statusBarColor: Color.fromRGBO(0, 0, 0, 0.0), //status bar is transparent
),
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'ROLL THE DICE',
theme: ThemeData(
brightness: Brightness.dark,
),
home: MyHomePage(title: 'ROLL THE DICE'),
debugShowCheckedModeBanner: false,
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Dice2D dice1 = new Dice2D(
size: 300.0,
borderWidth: 5.0,
displayInt: 2,
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Center(
child: Text(
widget.title,
)),
),
body: Column(
children: <Widget>[
SliderDiceSize(
minValue: 100.0,
maxValue: 300.0,
title: "Set the size of dice:",
dice: dice1,
titleColor: Colors.yellow,
),
SliderBorderWidth(titleColor: Colors.yellow,title: "Set the border width of dice:",dice: dice1,minValue: 1.0,maxValue: 10.0,),
Expanded(child: Center(child: dice1)),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
//function to display the number on dice as a toast
showToastText(dice1.getDisplay());
},
backgroundColor: Colors.yellow,
tooltip: "Show the number.",
child: Icon(Icons.message),
),
);
}
}
import 'package:flutter/material.dart';
import 'dart:math';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:vibration/vibration.dart';
void vibrateDiceRolling() {
Vibration.cancel();
Vibration.vibrate(duration: 50); //default is 500 ms
}
void showToastRolling() {
Fluttertoast
.cancel(); //to clear all scheduled toast call ; this is to make the toast call seem instant responsive.
Fluttertoast.showToast(
msg: "Roger that!",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.black87,
textColor: Colors.white70,
fontSize: 14.0,
);
}
class paintDice2D extends StatelessWidget {
@override
@required
final int display;
@required
final double borderWidth;
@required
final Color diceColor;
@required
final double diceSize;
paintDice2D(
{Key key, this.diceSize, this.display, this.borderWidth, this.diceColor})
: super(key: key);
Widget drawEmptyBox() {
return Center(
child: Container(),
);
}
Widget drawCircleDot() {
return Center(
child: Container(
decoration: BoxDecoration(shape: BoxShape.circle, color: diceColor),
),
);
}
Widget build(BuildContext context) {
double divSize = (diceSize - 2 * borderWidth) / 3;
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(10.0)),
border: Border.all(
color: diceColor, width: borderWidth, style: BorderStyle.solid),
),
height: diceSize,
width: diceSize,
child: Row(
children: <Widget>[
Column(
children: <Widget>[
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: (display == 3 ||
display == 4 ||
display == 5 ||
display == 6) ==
true
? drawCircleDot()
: drawEmptyBox(), // condition == true ? {code for true } : {code for false}
),
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child:
(display == 6) == true ? drawCircleDot() : drawEmptyBox(),
),
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: (display == 2 ||
display == 4 ||
display == 5 ||
display == 6) ==
true
? drawCircleDot()
: drawEmptyBox(),
),
],
),
Column(
children: <Widget>[
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: drawEmptyBox(),
),
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: (display == 1 || display == 3 || display == 5) == true
? drawCircleDot()
: drawEmptyBox(),
),
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: drawEmptyBox(),
),
],
),
Column(
children: <Widget>[
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: (display == 2 ||
display == 4 ||
display == 5 ||
display == 6) ==
true
? drawCircleDot()
: drawEmptyBox(),
),
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child:
(display == 6) == true ? drawCircleDot() : drawEmptyBox(),
),
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: (display == 3 ||
display == 4 ||
display == 5 ||
display == 6) ==
true
? drawCircleDot()
: drawEmptyBox(),
),
],
),
],
),
);
}
}
class Dice2D extends StatefulWidget {
@override
@required
double size;
@required
double borderWidth;
@required
int displayInt;
Dice2D({
Key key,
this.size,
this.borderWidth,
this.displayInt,
}) : super(key: key);
int getDisplay() {
return this.displayInt;
}
Dice2DState createState() {
return new Dice2DState();
}
}
class Dice2DState extends State<Dice2D> {
@override
Widget build(BuildContext context) {
int nextDisplay = Random().nextInt(6) + 1;
void rollDice() {
setState(() {
widget.displayInt = nextDisplay;
nextDisplay = Random().nextInt(6) + 1;
showToastRolling();
vibrateDiceRolling();
});
}
return FlatButton(
onPressed: () {
rollDice();
},
padding: EdgeInsets.all(0.0),
child: paintDice2D(
display: widget.displayInt,
borderWidth: widget.borderWidth,
diceSize: widget.size,
diceColor: Colors.yellow,
),
);
}
}
class SliderDiceSize extends StatefulWidget {
@required final String title;
@required Dice2D dice;
@required final double minValue;
@required final double maxValue;
@required final Color titleColor;
SliderDiceSize({Key key, this.title, this.dice, this.titleColor, this.maxValue, this.minValue}):super(key:key);
@override
SliderDiceSizeState createState() {
return new SliderDiceSizeState();
}
}
class SliderDiceSizeState extends State<SliderDiceSize> {
void setDiceSize(double a) {
setState(() {
int diceint = widget.dice.getDisplay(); //**
widget.dice.displayInt = diceint; //**
widget.dice.size = a; //**
});
}
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: new Text(
widget.title,
style: TextStyle(color: widget.titleColor, fontSize: 16.0),
),
),
Container(
child: new Slider(
value: widget.dice.size, //**
onChanged: (double value) => setDiceSize(value), //**
max: widget.maxValue,
min: widget.minValue,
activeColor: Colors.grey,
inactiveColor: Colors.white12,
),
),
],
);
}
}
class SliderBorderWidth extends StatefulWidget {
@required
final String title;
@required
Dice2D dice;
@required final double minValue;
@required final double maxValue;
@required final Color titleColor;
SliderBorderWidth(
{Key key,
this.dice,
this.title,
this.minValue,
this.maxValue,
this.titleColor});
@override
SliderBorderWidthState createState() {
return new SliderBorderWidthState();
}
}
class SliderBorderWidthState extends State<SliderBorderWidth> {
void setBorderWidth(double a) {
setState(() {
int diceint = widget.dice.getDisplay(); //**
widget.dice.borderWidth = a; //**
});}
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: new Text(
widget.title,
style: TextStyle(color: widget.titleColor, fontSize: 16.0),
),
),
Container(
child: new Slider(
value: widget.dice.borderWidth, //**
onChanged: (double value) => setBorderWidth(value), //**
max: widget.maxValue,
min: widget.minValue,
activeColor: Colors.grey,
inactiveColor: Colors.white12,
),
),
],
);
}
}
import 'package:do_dice/dice2D.dart';
import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart';
void showToastText(int a) {
Fluttertoast
.cancel(); //to clear all scheduled toast call ; this is to make the toast cal seem instant responsive.
Fluttertoast.showToast(
msg: '$a',
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.black87,
textColor: Colors.yellow,
fontSize: 14.0,
);
}
void main() {
SystemChrome.setSystemUIOverlayStyle(
SystemUiOverlayStyle(
statusBarColor: Color.fromRGBO(0, 0, 0, 0.0), //status bar is transparent
),
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'ROLL THE DICE',
theme: ThemeData(
brightness: Brightness.dark,
),
home: MyHomePage(title: 'ROLL THE DICE'),
debugShowCheckedModeBanner: false,
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Dice2D dice1 = new Dice2D(
size: 300.0,
borderWidth: 5.0,
displayInt: 2,
);
//~~ added this function to serve as callback
updateDiceSize(Dice2D dice,double size){
setState((){
dice.size = size;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Center(
child: Text(
widget.title,
)),
),
body: Column(
children: <Widget>[
SliderDiceSize(updateDiceSizeCallback: updateDiceSize(dice1,dice1.size), //~~passing the callback
minValue: 100.0,
maxValue: 300.0,
title: "Set the size of dice:",
dice: dice1,
titleColor: Colors.yellow,
),
Expanded(child: Center(child: dice1)),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
//function to display the number on dice as a toast
showToastText(dice1.getDisplay());
},
backgroundColor: Colors.yellow,
tooltip: "Show the number.",
child: Icon(Icons.message),
),
);
}
}
import 'package:flutter/material.dart';
import 'dart:math';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:vibration/vibration.dart';
void vibrateDiceRolling() {
Vibration.cancel();
Vibration.vibrate(duration: 50); //default is 500 ms
}
void showToastRolling() {
Fluttertoast
.cancel(); //to clear all scheduled toast call ; this is to make the toast call seem instant responsive.
Fluttertoast.showToast(
msg: "Roger that!",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.black87,
textColor: Colors.white70,
fontSize: 14.0,
);
}
class PaintDice2D extends StatelessWidget {
@override
@required
final int display;
@required
final double borderWidth;
@required
final Color diceColor;
@required
final double diceSize;
PaintDice2D(
{Key key, this.diceSize, this.display, this.borderWidth, this.diceColor})
: super(key: key);
Widget drawEmptyBox() {
return Center(
child: Container(),
);
}
Widget drawCircleDot() {
return Center(
child: Container(
decoration: BoxDecoration(shape: BoxShape.circle, color: diceColor),
),
);
}
Widget build(BuildContext context) {
double divSize = (diceSize - 2 * borderWidth) / 3;
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(10.0)),
border: Border.all(
color: diceColor, width: borderWidth, style: BorderStyle.solid),
),
height: diceSize,
width: diceSize,
child: Row(
children: <Widget>[
Column(
children: <Widget>[
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: (display == 3 ||
display == 4 ||
display == 5 ||
display == 6) ==
true
? drawCircleDot()
: drawEmptyBox(), // condition == true ? {code for true } : {code for false}
),
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child:
(display == 6) == true ? drawCircleDot() : drawEmptyBox(),
),
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: (display == 2 ||
display == 4 ||
display == 5 ||
display == 6) ==
true
? drawCircleDot()
: drawEmptyBox(),
),
],
),
Column(
children: <Widget>[
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: drawEmptyBox(),
),
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: (display == 1 || display == 3 || display == 5) == true
? drawCircleDot()
: drawEmptyBox(),
),
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: drawEmptyBox(),
),
],
),
Column(
children: <Widget>[
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: (display == 2 ||
display == 4 ||
display == 5 ||
display == 6) ==
true
? drawCircleDot()
: drawEmptyBox(),
),
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child:
(display == 6) == true ? drawCircleDot() : drawEmptyBox(),
),
Container(
width: divSize,
height: divSize,
padding: EdgeInsets.all(divSize / 5),
child: (display == 3 ||
display == 4 ||
display == 5 ||
display == 6) ==
true
? drawCircleDot()
: drawEmptyBox(),
),
],
),
],
),
);
}
}
class Dice2D extends StatefulWidget {
@override
@required
double size;
@required
double borderWidth;
@required
int displayInt;
Dice2D({
Key key,
this.size,
this.borderWidth,
this.displayInt,
}) : super(key: key);
int getDisplay() {
return this.displayInt;
}
Dice2DState createState() {
return new Dice2DState();
}
}
class Dice2DState extends State<Dice2D> {
@override
Widget build(BuildContext context) {
int nextDisplay = Random().nextInt(6) + 1;
void rollDice() {
setState(() {
widget.displayInt = nextDisplay;
nextDisplay = Random().nextInt(6) + 1;
showToastRolling();
vibrateDiceRolling();
});
}
return FlatButton(
onPressed: () {
rollDice();
},
padding: EdgeInsets.all(0.0),
child: PaintDice2D(
display: widget.displayInt,
borderWidth: widget.borderWidth,
diceSize: widget.size,
diceColor: Colors.yellow,
),
);
}
}
class SliderDiceSize extends StatefulWidget {
@required final String title;
@required Dice2D dice;
@required final double minValue;
@required final double maxValue;
@required final Color titleColor;
@required Function updateDiceSizeCallback; //~~
SliderDiceSize({Key key, this.title, this.dice, this.titleColor, this.maxValue, this.minValue,this.updateDiceSizeCallback}):super(key:key); //~~
@override
SliderDiceSizeState createState() {
return new SliderDiceSizeState();
}
}
class SliderDiceSizeState extends State<SliderDiceSize> {
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: new Text(
widget.title,
style: TextStyle(color: widget.titleColor, fontSize: 16.0),
),
),
Container(
child: new Slider(
value: widget.dice.size,
onChanged: (double value) => widget.updateDiceSizeCallback, //~~ I believe something needs to change here for slider to be able to drag.
max: widget.maxValue,
min: widget.minValue,
activeColor: Colors.grey,
inactiveColor: Colors.white12,
),
),
],
);
}
}
// Could also be separate functions for each property
updateDice({double size, double borderWidth, int displayInt}) {
setState(() {
if(size != null) dice1.size = size;
if(borderWidth != null) dice1.borderWidth = borderWidth;
if(displayInt != null) dice1.displayInt = displayInt;
});
}
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:math';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'ROLL THE DICE',
theme: ThemeData(
brightness: Brightness.dark,
),
home: MyHomePage(title: 'ROLL THE DICE'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Dice2D dice1 = new Dice2D(
size: 150.0,
displayInt: 2,
);
updateDice({double size, int displayInt}) {
setState(() {
if(size != null) dice1.size = size;
if(displayInt != null) dice1.displayInt = displayInt;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Center(
child: Text(
widget.title,
)),
),
body: Column(
children: [
Slider(
value: dice1.size,
min: 100.0,
max: 200.0,
onChanged: (value){
updateDice(size: value);
},),
DiceWidget(dice1.size, dice1.displayInt, updateDice),
],
),
);
}
}
class DiceWidget extends StatelessWidget {
final int _number;
final double _size;
final Function _onPressed;
DiceWidget(this._size, this._number, this._onPressed);
@override
Widget build(BuildContext context) {
return Center(child: RaisedButton(
onPressed: (){
_onPressed(displayInt: Random().nextInt(5)+1);
},
child: Text("$_number", style: TextStyle(fontSize: _size),)),);
}
}
class Dice2D {
var size;
var displayInt;
Dice2D({this.size,this.displayInt});
}