11import 'package:flutter/material.dart' ;
22import 'package:flutter_shaders/flutter_shaders.dart' ;
3+ import 'package:google_fonts/google_fonts.dart' ;
34import 'dart:ui' ;
45import 'shader_builder.dart' ;
56
67class NoiseOverlayShaderBuilder extends CustomShaderBuilder {
7- final double filmGrainIntensity;
8- final double noiseOpacity;
9-
10- const NoiseOverlayShaderBuilder ({
11- this .filmGrainIntensity = 0.2 ,
12- this .noiseOpacity = 0.3 ,
13- });
8+ const NoiseOverlayShaderBuilder ();
149
1510 @override
1611 bool get requiresImageSampler => true ;
@@ -22,8 +17,7 @@ class NoiseOverlayShaderBuilder extends CustomShaderBuilder {
2217 void setUniforms (FragmentShader shader, Size size, double time) {
2318 shader
2419 ..setFloat (0 , size.width)
25- ..setFloat (1 , size.height)
26- ..setFloat (2 , filmGrainIntensity);
20+ ..setFloat (1 , size.height);
2721 }
2822
2923 @override
@@ -34,23 +28,9 @@ class NoiseOverlayShaderBuilder extends CustomShaderBuilder {
3428 double time,
3529 Widget ? child,
3630 ) {
37- return Stack (
38- children: [
39- AnimatedSampler (
40- (image, size, canvas) {
41- shader.setImageSampler (0 , image);
42- canvas.drawRect (Rect .fromLTWH (0 , 0 , size.width, size.height), Paint ()..shader = shader);
43- },
44-
45- child: child ?? const SizedBox (),
46- ),
47- Center (
48- child: Text (
49- 'Noise' ,
50- style: TextStyle (color: Colors .white, fontSize: 32 , fontWeight: FontWeight .bold),
51- ),
52- ),
53- ],
31+ return NoiseShaderOverlayWidget (
32+ shader: shader,
33+ child: child,
5434 );
5535 }
5636
@@ -71,3 +51,75 @@ class NoiseOverlayShaderBuilder extends CustomShaderBuilder {
7151 );
7252 }
7353}
54+
55+ class NoiseShaderOverlayWidget extends StatefulWidget {
56+ const NoiseShaderOverlayWidget ({
57+ super .key,
58+ required this .shader,
59+ this .child,
60+ });
61+
62+ final FragmentShader shader;
63+ final Widget ? child;
64+
65+ @override
66+ State <NoiseShaderOverlayWidget > createState () => _NoiseShaderOverlayWidgetState ();
67+ }
68+
69+ class _NoiseShaderOverlayWidgetState extends State <NoiseShaderOverlayWidget > {
70+ double intensity = 0.2 ;
71+
72+ @override
73+ void initState () {
74+ super .initState ();
75+ widget.shader.setFloat (2 , intensity);
76+ }
77+
78+ @override
79+ Widget build (BuildContext context) {
80+ return Stack (
81+ children: [
82+ AnimatedSampler (
83+ (image, size, canvas) {
84+ widget.shader.setImageSampler (0 , image);
85+ canvas.drawRect (Rect .fromLTWH (0 , 0 , size.width, size.height), Paint ()..shader = widget.shader);
86+ },
87+
88+ child: widget.child ?? const SizedBox (),
89+ ),
90+ Center (
91+ child: Text (
92+ 'Noise' ,
93+ style: TextStyle (color: Colors .white, fontSize: 32 , fontWeight: FontWeight .bold),
94+ ),
95+ ),
96+ Positioned (
97+ bottom: 0 ,left: 0 , right: 0 ,
98+ child: Row (
99+ children: [
100+ Expanded (
101+ child: Slider (
102+ value: intensity,
103+ min: 0 ,
104+ max: 1 ,
105+ onChanged: (value) {
106+ setState (() {
107+ intensity = value;
108+ widget.shader.setFloat (2 , intensity);
109+ });
110+ },
111+ ),
112+ ),
113+ Text (
114+ 'Intensity: ${intensity .toStringAsFixed (2 )}' ,
115+ style: GoogleFonts .spaceMono (
116+ fontSize: 14 ,
117+ ),
118+ ),
119+ ],
120+ ),
121+ ),
122+ ],
123+ );
124+ }
125+ }
0 commit comments