nikolaydymura / flutter_image_filters

MIT License
28 stars 13 forks source link

Rendering problem #30

Closed nanox77 closed 2 months ago

nanox77 commented 4 months ago

Hello everyone,

I'm having a rendering problem. I have a texture loaded for the first time and I can change the configuration with different filters using buttons. The problem is, as seen in the video, the rendering white flickering. How can I avoid it? Thank you!.

Here is video: demo

Here is code:

import 'package:flutter/material.dart';
import 'package:flutter_image_filters/flutter_image_filters.dart';

class PreviewPage extends StatefulWidget {
  const PreviewPage({super.key});

  @override
  State<PreviewPage> createState() => _PreviewPageState();
}

class _PreviewPageState extends State<PreviewPage> {
  final imageUrl = 'assets/demo.jpeg';

  late TextureSource texture;
  late ShaderConfiguration configuration;
  bool textureLoaded = false;

  @override
  void initState() {
    super.initState();
    TextureSource.fromAsset(imageUrl).then((value) {
      setState(() {
        texture = value;
        configuration = NoneShaderConfiguration();
        textureLoaded = true;
      });
    });
  }

  Widget buildImage() {
    if (!textureLoaded) {
      return const Center(child: CircularProgressIndicator());
    }

    return ImageShaderPreview(
      fix: BoxFit.cover,
      texture: texture,
      configuration: configuration,
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        top: false,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Expanded(
              flex: 4,
              child: buildImage(),
            ),
            const SizedBox(height: 16),
            SizedBox(
              height: 100,
              child: ListView(
                scrollDirection: Axis.horizontal,
                children: [
                  _buildBrightnessEffect(),
                  _buildContrastEffect(),
                  _buildGrayscaleEffect(),
                  _buildExposureEffect(),
                  _resetButton(),
                ],
              ),
            ),
            const SizedBox(height: 20),
          ],
        ),
      ),
    );
  }

  Widget _buildExposureEffect() {
    return _buildEffect(
      'Exposure',
      Icons.brightness_7,
      () {
        final newConfig = ExposureShaderConfiguration()..exposure = 0.5;
        setState(() => configuration = newConfig);
      },
    );
  }

  Widget _buildGrayscaleEffect() {
    return _buildEffect(
      'Greyscale',
      Icons.filter_b_and_w,
      () {
        final newConfig = GrayscaleShaderConfiguration();
        setState(() => configuration = newConfig);
      },
    );
  }

  Widget _buildContrastEffect() {
    return _buildEffect(
      'Contrast',
      Icons.contrast,
      () {
        final newConfig = ContrastShaderConfiguration()..contrast = 0.6;
        setState(() => configuration = newConfig);
      },
    );
  }

  Widget _buildBrightnessEffect() {
    return _buildEffect(
      'Brightness',
      Icons.brightness_6,
      () {
        final newConfig = BrightnessShaderConfiguration()..brightness = 0.1;
        setState(() => configuration = newConfig);
      },
    );
  }

  Widget _resetButton() {
    return _buildEffect(
      'Reset',
      Icons.refresh,
      () async {
        final newTexture = await TextureSource.fromAsset(imageUrl);
        setState(() {
          texture = newTexture;
          configuration = NoneShaderConfiguration();
        });
      },
    );
  }

  Widget _buildEffect(String effectName, IconData icon, Function()? onPressed) {
    return ElevatedButton(
      onPressed: onPressed,
      style: ElevatedButton.styleFrom(
        elevation: 0,
      ),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Icon(icon),
          const SizedBox(height: 8),
          Text(effectName),
        ],
      ),
    );
  }
}