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),
    );
  }

}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐