You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter 如何从TextEditingController取值赋值给ChangeNotifier变量

解决方案

你需要在全局状态类中额外存储输入的初始玩家数量,调整后完整实现代码如下:

1. 修正状态管理类 ZmienneClass

class ZmienneClass extends ChangeNotifier {
  int? _gracze; // 当前玩家数量
  int? _initialGracze; // 存储初始输入的玩家数量
  var _rundy;

  int get iloscGraczy => _gracze ?? 0;

  // 补全设置玩家数方法,同时保存初始值
  void setPlayerCount({required int liczbagraczy}) {
    _gracze = liczbagraczy;
    _initialGracze = liczbagraczy;
    notifyListeners();
  }

  // 玩家减1逻辑,小于等于0时自动重置为初始值
  void decrementCounter() {
    if (_gracze == null || _initialGracze == null) return;
    _gracze -= 1;
    if (_gracze! <= 0) {
      _gracze = _initialGracze;
    }
    notifyListeners();
  }
}

2. 修正输入页 InfoPage

class _InfoPageState extends State<InfoPage> {
  TextEditingController graczeCon = TextEditingController();
  TextEditingController rundyCon = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [ChangeNotifierProvider.value(value: ZmienneClass())],
      child: Scaffold(
        backgroundColor: const Color.fromARGB(255, 84, 84, 84),
        appBar: AppBar(toolbarHeight: 70),
        body: Stack(children: [
          Column(
            children: [
              Center(
                child: SizedBox(
                  child: TextFormField(
                    keyboardType: TextInputType.number, // 限制仅输入数字
                    controller: graczeCon,
                  ),
                ),
              )
            ],
          ),
          Align(
            child: TextButton(
              onPressed: () {
                // 判空避免输入为空时解析崩溃
                if (graczeCon.text.isEmpty) return;
                final inputCount = int.parse(graczeCon.text);
                Provider.of<ZmienneClass>(context, listen: false)
                    .setPlayerCount(liczbagraczy: inputCount);

                Navigator.push(context,
                    MaterialPageRoute(builder: (context) => FirGamePage()));
              },
              child: const Text("进入游戏"),
            ),
          )
        ]),
      ),
    );
  }
}

3. 修正游戏页 FirGamePage 调用逻辑

class _FirGamePageState extends State<FirGamePage> {
  @override
  Widget build(BuildContext context) {
    final zmienneState = Provider.of<ZmienneClass>(context);
    return Scaffold(
      body: Column(
        children: [
          Align(
            alignment: Alignment.topLeft,
            child: Text("Osoby: ${zmienneState.iloscGraczy}"),
          ),
          // 减1按钮示例
          TextButton(
            onPressed: () {
              Provider.of<ZmienneClass>(context, listen: false).decrementCounter();
            },
            child: const Text("减少1名玩家"),
          )
        ],
      ),
    );
  }
}

SecGamePage 直接复用 FirGamePage 调用 Provider 的逻辑即可,不需要额外传值,初始玩家数已经存储在全局状态中。

内容的提问来源于stack exchange,提问作者Malak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:36:05