【问题标题】:Flutter StatefulWidget parameter unable to passFlutter StatefulWidget 参数无法传递
【发布时间】:2021-03-23 10:57:48
【问题描述】:

我知道有一个非常相似的案例并得到了解决,我将我的代码修改为 99% 的喜欢,但不知何故我的列表未定义。

未定义的列表位于 ' ...(list as List).map((answer) { '.

import 'package:flutter/material.dart';
import 'package:kzstats/common/AppBar.dart';
import 'package:kzstats/common/Drawer.dart';
import '../toggleButton.dart';

class Settings extends StatelessWidget {
  final String currentPage = 'Settings';
  static const _modes = [
    {
      'mode': ['KZTimer', 'SimpleKZ', 'Vanilla']
    },
    {
      'tickrate': [128, 102, 64]
    },
  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: HomepageAppBar(currentPage),
        drawer: HomepageDrawer(),
        body: Padding(
          padding: EdgeInsets.all(8),
          child: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                buildHeader(
                  title: 'Mode',
                  child: ToggleButton(_modes[0]['mode']),
                ),
                SizedBox(height: 32),
                buildHeader(
                  title: 'Tick rate',
                  child: ToggleButton(_modes[1]['tickrate']),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

Widget buildHeader({@required String title, @required Widget child}) => Column(
      children: [
        Text(
          title,
          style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
        ),
        const SizedBox(height: 16),
        child,
      ],
    );

class ToggleButton extends StatefulWidget {
  final List<String> list;
  ToggleButton(this.list);

  @override
  State createState() => new _ToggleButtonState();
}

class _ToggleButtonState extends State<ToggleButton> {
  List<bool> _selections = [true, false, false];

  @override
  Widget build(BuildContext context) {
    return new Container(
      color: Colors.blue.shade200,
      child: ToggleButtons(
        isSelected: _selections,
        fillColor: Colors.lightBlue,
        color: Colors.black,
        selectedColor: Colors.white,
        renderBorder: false,
        children: <Widget>[
          ...(list as List<String>).map((answer) {
            return Padding(
              padding: EdgeInsets.symmetric(horizontal: 12),
              child: Text(
                answer,
                style: TextStyle(fontSize: 18),
              ),
            );
          }).toList(),
        ],
        onPressed: (int index) {
          setState(() {
            for (int i = 0; i < _selections.length; i++) {
              if (index == i) {
                _selections[i] = true;
              } else {
                _selections[i] = false;
              }
            }
          });
        },
      ),
    );
  }
}

如果有人需要完整代码,请访问https://github.com/davidp918/KZStats

我是 Flutter 和 stackoverflow 的新手,如果有任何问题,请发表评论,谢谢!

【问题讨论】:

  • 我认为您必须使用widget.list 才能从State 类中访问StatefulWidget 的变量。
  • _modes[0]['tickrate'] 在这里你应该写 _modes[1]['tickrate'](用 1 替换 0),因为第一个(索引 0 处的元素)没有属性 tickrate

标签: flutter dart statefulwidget


【解决方案1】:

我们可以使用“widget”从状态类中访问StatefulWidget的变量(例如:widget.list)

请参考以下代码示例。

import 'package:flutter/material.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,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        home: Settings());
  }
}

class Settings extends StatelessWidget {
  final String currentPage = 'Settings';
  static const modes = [
    {
      'mode': ['KZTimer', 'SimpleKZ', 'Vanilla']
    },
    {
      'tickrate': [128, 102, 64]
    },
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: Container(
          child: Padding(
            padding: EdgeInsets.all(8),
            child: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  buildHeader(
                    title: 'Mode',
                    child: ToggleButton(modes[0]['mode']),
                  ),
                  SizedBox(height: 32),
                  buildHeader(
                    title: 'Tick rate',
                    child: ToggleButton(modes[1]['tickrate']),
                  ),
                  SizedBox(height: 32),
                  buildHeader(
                    title: 'Mode',
                    child: ToggleButton(modes[0]['mode']),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

Widget buildHeader({@required String title, @required Widget child}) {
  return Column(
    children: [
      Text(
        title,
        style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
      ),
      SizedBox(height: 16),
      child,
    ],
  );
}

class ToggleButton extends StatefulWidget {
  final List list;
  ToggleButton(this.list);

  @override
  State createState() => new _ToggleButtonState();
}

class _ToggleButtonState extends State<ToggleButton> {
  List<bool> _selections = [false, false, false];

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.blue.shade200,
      child: ToggleButtons(
        isSelected: _selections,
        fillColor: Colors.lightBlue,
        color: Colors.black,
        selectedColor: Colors.white,
        renderBorder: false,
        children: [
          ...(widget.list as List)?.map((answer) {
            return Padding(
              padding: EdgeInsets.symmetric(horizontal: 12),
              child: Text(
                answer.toString() ?? '',
                style: TextStyle(fontSize: 18),
              ),
            );
          })?.toList(),
        ],
        onPressed: (int index) {
          setState(() {
            for (int i = 0; i < _selections.length; i++) {
              if (index == i) {
                _selections[i] = true;
              } else {
                _selections[i] = false;
              }
            }
          });
        },
      ),
    );
  }
}

【讨论】:

    猜你喜欢
    • 2019-10-08
    • 2020-04-11
    • 2019-08-25
    • 1970-01-01
    • 2020-09-19
    • 2018-10-19
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多