【问题标题】:Flutter - Checkbox animation doesn't showFlutter - 复选框动画不显示
【发布时间】:2019-11-23 21:26:12
【问题描述】:

点击时该值有效改变,但动画不显示:

这是我的代码:

 var editGender = Padding(
      padding: const EdgeInsets.only(top: 12.0),
      child: Column(
        children: <Widget>[
          CheckboxListTile(
            value: _male,
            onChanged: _maleChanged,
            title: Text("Male"),
            activeColor: Theme.of(context).primaryColor,
          ),
          CheckboxListTile(
            value: _female,
            onChanged: _femaleChanged,
            title: Text("Female"),
            activeColor: Theme.of(context).primaryColor,
          )  
        ],
      ),
    );

点击编辑按钮时:

    FlatButton(
      onPressed: (){
          buildShowRoundedModalBottomSheet(context, title, editGender, option);
      },
      child: Text('Edit'),

它显示了底页:

Future buildShowRoundedModalBottomSheet(BuildContext context, String title, Widget content,[String date]) {
    return showRoundedModalBottomSheet(
        context: context,
        radius: 20.0,
        builder: (context){
          
          return Padding(
            padding: const EdgeInsets.only(top: 20.0, bottom: 20.0, left: 20.0, right: 20.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                Text(
                  title,
                  style: TextStyle(
                    fontFamily: 'SamsungSans',
                    fontSize: 20.0,
                  ),
                ),
                content,
                ...

我将相同的上下文传递给小部件:/

【问题讨论】:

  • 您的底页(或其他任何东西)似乎没有在重建。
  • 哦,是的,这是真的!所以我必须在Builder 小部件中的底部工作表?
  • StatefulBuilder 可能会更有帮助。
  • 可能你的状态是由调用显示BottomSheet的类处理的。状态处于不同的上下文中,不会调用重建。
  • 这很奇怪。我将相同的上下文传递到底部工作表。

标签: flutter dart


【解决方案1】:

setState 会改变值,但它不会重建你的底部工作表,因为它在 onPressedFlatButton 上被调用。您当然不会再次调用 onPressed,但您也不想这样做。

正如我在 cmets 中提到的,StatefulBuilder 可以完成这项工作。

一个工作示例

import 'package:flutter/material.dart';
import 'package:rounded_modal/rounded_modal.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  bool value = false;

  void _incrementCounter() {
    showRoundedModalBottomSheet(
        context: context,
        builder: (context) {
          return StatefulBuilder(builder: (context, setState) {
            return Container(
              height: 200.0,
              child: Checkbox(value: value, onChanged: (val) {
                setState(() {
                  value = val;
                });
              }),
            );
          });
        });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

【讨论】:

  • 我尝试用 StatefulBuilder 构建器包装content 或直接包装editGender,但没有。我很高兴看到它应该工作,但我真的不明白它可能来自哪里。是因为我处理不同的文件吗?我不这么认为,因为我正在传输正确的上下文
  • 我没听懂你在说什么。你必须用StatefulBuilder 包裹Padding(....
  • 哪个填充?
  • 不,不是那样。我说的是showRoundedModalBottomSheet 中的填充。
  • 哦,我也试过了,结果还是一样:/
【解决方案2】:

正如@10101010 所说,您必须使用有状态小部件。在 _femaleChanged 和 _maleChanged 中,您必须使用 setState()。示例:

void _femaleChanged(bool value) =>  setState(() => _female = value);

【讨论】:

  • 已经是这样了。我正在使用 statefulwidget 来了解状态。否则,您将看不到值的变化。我不明白为什么动画不显示。
猜你喜欢
  • 2019-05-06
  • 2018-11-12
  • 2013-10-06
  • 1970-01-01
  • 2017-03-26
  • 2019-10-20
  • 2018-08-16
  • 2019-12-31
相关资源
最近更新 更多