Flutter - calling setState() from other widget

后端 未结 3 1223
臣服心动
臣服心动 2020-12-17 10:25

Is it possible to call setState() of particular widget (embedded in other widgets) from other widgets onPressed() method so only that

3条回答
  •  忘掉有多难
    2020-12-17 10:40

    This is a possible solution using streams:

    import 'dart:async';
    
    import 'package:flutter/material.dart';
    void main() => runApp(new MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          title: 'Timer',
          theme: new ThemeData(
            primaryColor: Colors.grey.shade800,
          ),
          home: new MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatelessWidget {
    
      StreamController _controller = StreamController();
    
      int _seconds = 1;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("title"),
          ),
          body: Column(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: [
              MyTextWidget(stream: _controller.stream), //just update this widget
              Divider(),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  IconButton(
                    icon: Icon(Icons.add_circle),
                    onPressed: _addPressed,
                    iconSize: 150.0,
                  ),
                  IconButton(
                    icon: Icon(Icons.remove_circle),
                    onPressed: ()=> _controller.add(_seconds++),
                    iconSize: 150.0,
                  ),
                ],
              )
            ],
          ),
        );
      }
    
      void _addPressed() {
        //somehow call _updateSeconds()
      }
    }
    
    class MyTextWidget extends StatefulWidget{
    
      final Stream stream;
    
      MyTextWidget({this.stream});
    
      @override
      _MyTextWidgetState createState() => _MyTextWidgetState();
    }
    
    class _MyTextWidgetState extends State {
    
      int secondsToDisplay = 0;
    
      void _updateSeconds(int newSeconds) {
        setState(() {
          secondsToDisplay = newSeconds;
        });
      }
    
      @override
      void initState() {
        super.initState();
        widget.stream.listen((seconds) {
          _updateSeconds(seconds);
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Text(
          secondsToDisplay.toString(),
          textScaleFactor: 5.0,
        );
      }
    }
    

提交回复
热议问题