How to setState between different files

Viewed 39

please somebody learn me how to do this the below is very simple version of my code but i want it exactly like this we have three different files. every one them has one statefull widget like this

Home.dart

import 'package:flutter/material.dart';
import 'package:gtradar_test_1/GG/appbarz.dart';
import 'package:gtradar_test_1/GG/bodyz.dart';


class Home extends StatefulWidget {
  const Home({ Key? key }) : super(key: key);

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Bodyz(),
      appBar: PreferredSize(preferredSize: Size(20,20),child: AppBarz(),),
    );
  }
}

Bodyz.dart

import 'package:flutter/material.dart';



class Bodyz extends StatefulWidget {
  const Bodyz({ Key? key }) : super(key: key);

  @override
  State<Bodyz> createState() => _BodyzState();
}

class _BodyzState extends State<Bodyz> {
  bool xxx = false;
  void xxx_Changer(){
    setState(() {
      xxx = !xxx;
    });

  }
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      child: xxx? Container(color: Colors.black):SizedBox(),
      
    );
  }
}

Appbarz

import 'package:flutter/material.dart';

class AppBarz extends StatefulWidget {
  const AppBarz({ Key? key }) : super(key: key);

  @override
  State<AppBarz> createState() => _AppBarzState();
}

class _AppBarzState extends State<AppBarz> {
  @override
  Widget build(BuildContext context) {
    return AppBar(
        leading: IconButton(
          icon: Icon(Icons.menu),
          onPressed: ?,
        ),

    )
      
    ;
  }
}

ok,how can i call xxx_Changer() in appbar icon button on pressed or change xxx in appbar?

2 Answers

final ValueChanged onValueChanged;

above Field do the trick... you have to use this and can get the value from appbar class to homeclass then use setState to update your UI

You need to pass xxx_Changer as a function to the AppBarz and get xxx variable as a parameter in Bodyz widget. Like this;

Home.dart

import 'package:flutter/material.dart';
import 'package:gtradar_test_1/GG/appbarz.dart';
import 'package:gtradar_test_1/GG/bodyz.dart';


class Home extends StatefulWidget {
  const Home({ Key? key }) : super(key: key);

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  bool xxx = false;
  void xxx_Changer(){
    setState(() {
      xxx = !xxx;
    });

  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Bodyz(xxx: xxx),
      appBar: PreferredSize(preferredSize: Size(20,20),child: AppBarz(xxx_Changer: xxx_Changer),),
    );
  }
}

Bodyz.dart

import 'package:flutter/material.dart';



class Bodyz extends StatefulWidget {
 final String xxx;
  const Bodyz({ Key? key, this.xxx }) : super(key: key);

  @override
  State<Bodyz> createState() => _BodyzState();
}

class _BodyzState extends State<Bodyz> {
  
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      child: widget.xxx? Container(color: Colors.black):SizedBox(),
      
    );
  }
}

Appbarz

import 'package:flutter/material.dart';

class AppBarz extends StatefulWidget {
  final Function xxx_Changer;
  const AppBarz({ Key? key, Function xxx_Changer }) : super(key: key);

  @override
  State<AppBarz> createState() => _AppBarzState();
}

class _AppBarzState extends State<AppBarz> {
  @override
  Widget build(BuildContext context) {
    return AppBar(
        leading: IconButton(
          icon: Icon(Icons.menu),
          onPressed: widget.xxx_Changer(),
        ),

    )
      
    ;
  }
}
Related