Flutter/Dart中如何通过Checkbox配合列表修改Text,解决onChanged/setState异常问题
问题根源
- 子组件
ChangeText调用自身的setState只会刷新自身组件,无法触发父组件MyHomePage的重绘,所以父组件里依赖t变量的Text组件不会同步更新 - 跨组件共享的状态不应该定义为全局变量,也不应该由子组件单独维护
修复方案
将共享状态上移到父组件_MyHomePageState中管理,给子组件ChangeText传递状态变化的回调函数,父组件收到回调后调用自身的setState更新状态,触发全页面刷新即可实现文本同步切换。
修复后完整可运行代码
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: '文本切换演示', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: '文本切换'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key? key, required this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { // 所有共享状态统一移到父组件管理 bool boxChecked = false; final textChange = [" 可能成为 ", " 已经成为 "]; int t = 0; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Divider(), Container( width: MediaQuery.of(context).size.width / 1.2, child: Text( '我遇到了代码运行异常的问题,尝试了很多方案都没有解决。我希望勾选复选框可以切换下方的文本内容' ), ), Divider(), Container( width: MediaQuery.of(context).size.width / 1.2, // 给子组件传递当前勾选状态和变化回调 child: ChangeText( value: boxChecked, onChanged: (value) { setState(() { boxChecked = value!; t = boxChecked ? 1 : 0; }); }, ), ), Divider(), Container( width: MediaQuery.of(context).size.width / 1.2, child: Text( '你${textChange[t]}一名应用开发者。', ), ), ], ), ), ); } } class ChangeText extends StatefulWidget { // 定义入参接收父组件传递的状态和回调 final bool value; final ValueChanged<bool?> onChanged; const ChangeText({Key? key, required this.value, required this.onChanged}) : super(key: key); @override State<ChangeText> createState() => _ChangeText(); } class _ChangeText extends State<ChangeText> { @override Widget build(BuildContext context) { return Container( child: CheckboxListTile( title: const Text('学习Flutter', style: TextStyle(fontSize: 14),), value: widget.value, onChanged: widget.onChanged, ), ); } }
内容的提问来源于stack exchange,提问作者Stuart
相关产品推荐
相关产品推荐

