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
相关产品推荐
相关产品推荐

