Flutter 颤振滑块未移动或更新

Flutter 颤振滑块未移动或更新,flutter,Flutter,我正在学习颤振(以及一般的编码),但我似乎无法找到我最新项目的问题。当我在模拟器中运行时,滑块形状很好,单击拇指,标签就会显示出来,但拇指根本不会在轨迹上移动,因此不会调用onChanged事件 import 'resources.dart'; import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; class ItemDetail extends StatefulWidget {

我正在学习颤振(以及一般的编码),但我似乎无法找到我最新项目的问题。当我在模拟器中运行时,滑块形状很好,单击拇指,标签就会显示出来,但拇指根本不会在轨迹上移动,因此不会调用onChanged事件

import 'resources.dart';
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';

class ItemDetail extends StatefulWidget {
  final Item item;

  ItemDetail({Key key, @required this.item}) : super(key: key);

  @override
  _ItemDetailState createState() => new _ItemDetailState(item: item);
}

class _ItemDetailState extends State<ItemDetail> {
  Item item;

  _ItemDetailState({Key key, @required this.item});

  @override
  Widget build(BuildContext context) {
    double margin = ((item.listPrice - item.stdUnitCost)/item.listPrice)*100;
    return new Scaffold(
      appBar: AppBar(
        title: new Text('Item Detail'),
      ),
      body: new Column(
        children: <Widget>[
          new Padding(padding: EdgeInsets.symmetric(vertical: 20.0)),
          new Text(item.itemCode),
          new Text(item.itemDescription),
          new Text(item.itemExtendedDescription),
          new Divider(height: 40.0,),
          new Text('List Price: \$${item.listPrice}'),
          new Text('Cost: \$${item.stdUnitCost}'),
          item.itemType=='N'
              ? new Text('Non-Stock (${item.itemType})')
              : new Text('Stock Item (${item.itemType})'),
          new Text('Available: ${item.stockAvailable}'),
          new Padding(padding: EdgeInsets.symmetric(vertical: 10.0)),
          new Slider(
            value: margin,
            divisions: 20,
            min: 0.0,
            max: 100.0,
            label: margin.round().toString(),
            onChanged: (double value) {
              setState(() {
                margin = value;
              });
            },
          )
        ],
      ),
    );
  }
}
导入“resources.dart”;
进口“包装:颤振/材料.省道”;
进口“包装:颤振/基础.dart”;
类ItemDetail扩展了StatefulWidget{
最后项目;
ItemDetail({Key Key,@required this.item}):超级(Key:Key);
@凌驾
_ItemDetailState createState()=>new\u ItemDetailState(项:项);
}
类_ItemDetailState扩展状态{
项目;
_ItemDetailState({Key Key,@required this.item});
@凌驾
小部件构建(构建上下文){
双保证金=((item.listPrice-item.stdUnitCost)/item.listPrice)*100;
归还新脚手架(
appBar:appBar(
标题:新文本(“项目详细信息”),
),
正文:新栏目(
儿童:[
新填充(填充:边集。对称(垂直:20.0)),
新文本(项目.项目代码),
新文本(项目.项目说明),
新文本(item.itemExtendedDescription),
新隔板(高度:40.0,),
新文本('listPrice:\$${item.listPrice}'),
新文本('Cost:\${item.stdUnitCost}'),
item.itemType=='N'
?新文本('非库存(${item.itemType}'))
:新文本($Stock Item(${Item.itemType})),
新文本('Available:${item.stockAvailable}'),
新填充(填充:边集。对称(垂直:10.0)),
新滑块(
价值:保证金,
分部:20,
最小值:0.0,
最高:100.0,
标签:margin.round().toString(),
一旦更改:(双值){
设置状态(){
保证金=价值;
});
},
)
],
),
);
}
}

问题:在上述示例中,
边距
不是状态变量。它是
build
方法中的局部变量

修复:将其作为实例变量移动

原因:小部件只有在其状态发生变化时才会得到重建

代码:

class _ItemDetailState extends State<ItemDetail> {
  Item item;
  var margin;

  _ItemDetailState({Key key, @required this.item}) {
    this.margin = ((item.listPrice - item.stdUnitCost)/item.listPrice)*100;
  }

  @override
  Widget build(BuildContext context) {
    //same as now
  }
}
class\u ItemDetailState扩展状态{
项目;
var保证金;
_ItemDetailState({Key Key,@required this.item}){
this.margin=((item.listPrice-item.stdUnitCost)/item.listPrice)*100;
}
@凌驾
小部件构建(构建上下文){
//和现在一样
}
}

对于其他来到这里的人,我有一个稍微不同的原因,滑块没有更新。我将
值设置为常量。确保该值是一个变量

这:

不是这个:

Slider(
  value: 0, //                     <-- problem
  ...
  onChanged: (newValue) => {
    setState(() => _myValue = newValue)
  },
),
滑块(
值:0,//{
设置状态(()=>_myValue=newValue)
},
),

我在给出
滑块(值:tasksDetails.taskImportance.toDouble()等)时遇到了问题。

我使用了
滑块(_currentImportance??tasksDetails.taskImportance).toDouble()等)


然后可以移动滑块。我不知道这为什么现在起作用。我只能猜测与上面Denish的原因“原因:小部件只有在状态发生变化时才会重新生成”有关。在这两种情况下,所选滑块值都已正确保存。

我认为可变边距在构建UI时没有作用域。调试时,可以看到变量中的更改,但它不会呈现。我用下面的方法尝试了它,并且能够更新UI值

    class _MyHomePageState extends State<MyHomePage> {

     double margin=0;

     Widget getSlider(BuildContext context)
      {

        return Slider(
      value:margin.toDouble(),
      onChanged: (newRating){

        setState(() {
          margin = newRating;
        });

      },
      min: 0,
      max: 100,
      divisions: 5,
    );
   } // getslider method closed
     // @0verride Widget build method
    // under children widgets , simply call the getSlider method to place the slider
 } //class
class\u MyHomePageState扩展状态{
双边距=0;
小部件getSlider(构建上下文)
{
返回滑块(
值:margin.toDouble(),
变更后:(新评级){
设置状态(){
保证金=新评级;
});
},
分:0,,
最高:100,
分部:5,
);
}//getslider方法已关闭
//@0verride小部件生成方法
//在子窗口小部件下,只需调用getSlider方法来放置滑块
}//类

当我将变量放入构建函数中时,我遇到了这个问题,这对我来说也很有效。谢谢
    class _MyHomePageState extends State<MyHomePage> {

     double margin=0;

     Widget getSlider(BuildContext context)
      {

        return Slider(
      value:margin.toDouble(),
      onChanged: (newRating){

        setState(() {
          margin = newRating;
        });

      },
      min: 0,
      max: 100,
      divisions: 5,
    );
   } // getslider method closed
     // @0verride Widget build method
    // under children widgets , simply call the getSlider method to place the slider
 } //class