flutter - InheritedWidget共享数据
flutter - InheritedWidget 共享数据
·
flutter - InheritedWidget 共享数据

import 'package:flutter/material.dart';
import 'ThemeColor.dart';
import 'ThemedText.dart';
import 'ThemedButton.dart';
/**
* Author : wn
* Email : maoning20080808@163.com
* Date : 2025/6/18 17:23
* Description :
*/
class InheritedWidgetDemo extends StatefulWidget {
InheritedWidgetDemo({super.key});
@override
State<StatefulWidget> createState() => _InheritedWidgetDemoState();
}
class _InheritedWidgetDemoState extends State<InheritedWidgetDemo>{
Color _currentColor = Colors.red;
void _changeColor(){
setState(() {
_currentColor = _currentColor == Colors.red ? Colors.green : Colors.red;
});
}
@override
Widget build(BuildContext context) {
//在Widget树顶层提供共享数据
return ThemeColor(
color: _currentColor,
child: Scaffold(
appBar: AppBar(title: Text("InheritedWidget Demo"),),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ThemedText("文本颜色变化"),
SizedBox(height: 20,),
ThemedButton(onPressed: _changeColor),
SizedBox(height: 20),
TextButton(onPressed: _changeColor, child: Text("改变颜色", style: TextStyle(fontSize: 36),))
],
),
),
),
);
}
}
import 'package:flutter/material.dart';
/**
* Author : wn
* Email : maoning20080808@163.com
* Date : 2025/6/18 17:05
* Description :
*/
class ThemeColor extends InheritedWidget {
ThemeColor({super.key, required this.color, required super.child});
//共享的数据
final Color color;
//定义一个静态方法方便子Widget获取实例
static ThemeColor? of(BuildContext context){
return context.dependOnInheritedWidgetOfExactType<ThemeColor>();
}
//重写updateShouldNotify方法,决定何时通知依赖的Widget重建
@override
bool updateShouldNotify(ThemeColor oldWidget) {
return color != oldWidget.color;
}
}
import 'package:flutter/material.dart';
import 'ThemeColor.dart';
/**
* Author : wn
* Email : maoning20080808@163.com
* Date : 2025/6/18 17:20
* Description : 使用另一个共享数据
*/
class ThemedButton extends StatelessWidget {
final VoidCallback onPressed;
const ThemedButton({required this.onPressed, super.key});
@override
Widget build(BuildContext context) {
//获取共享的ThemeColor数据
final themeColor = ThemeColor.of(context)?.color?? Colors.red;
return ElevatedButton(onPressed: onPressed,
style: ElevatedButton.styleFrom(backgroundColor: themeColor),
child: Text("按钮颜色变化", style: TextStyle(fontSize: 50),));
}
}
import 'package:flutter/material.dart';
import 'ThemeColor.dart';
/**
* Author : wn
* Email : maoning20080808@163.com
* Date : 2025/6/18 17:09
* Description :
*/
class ThemedText extends StatelessWidget {
final String text;
ThemedText(this.text, {super.key});
@override
Widget build(BuildContext context) {
//获取共享的ThemeColor数据
final themeColor = ThemeColor.of(context)?.color?? Colors.black;
return Text(
text,
style: TextStyle(color: themeColor, fontSize: 30),
);
}
}更多推荐


所有评论(0)