取消流订阅

时间:2020-08-13 16:41:33

标签: flutter

我正在使用此https://github.com/awesomeWM/awesome/blob/7a759432d3100ff6870e0b2b427e3352bf17c7cc/lib/awful/widget/tasklist.lua#L641-L676软件包来检查键盘的可见性。我想要去的地方效果很好。但是,这似乎会影响(当我删除软件包时,键盘按预期方式工作)我的键盘在小部件树中的其他位置。如何取消在initState中正在收听的订阅?我想我需要在dispose中做些什么?我不太确定该插件在做什么!

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

    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatefulWidget {
      MyApp({Key key}) : super(key: key);
    
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      bool _keyboardState;
    
      @override
      void initState() {
        super.initState();
        _keyboardState = KeyboardVisibility.isVisible;
        KeyboardVisibility.onChange.listen((bool visible) {
          setState(() {
            _keyboardState = visible;
          });
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: KeyboardDismissOnTap(
            child: Scaffold(
              appBar: AppBar(
                title: Text('Keyboard Visibility Example'),
              ),
              body: Center(
                child: Padding(
                  padding: EdgeInsets.all(24.0),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      TextField(
                        keyboardType: TextInputType.text,
                        decoration: InputDecoration(
                          labelText: 'Input box for keyboard test',
                        ),
                      ),
                      Container(height: 60.0),
                      Text(
                        'The keyboard is: ${_keyboardState ? 'VISIBLE' : 'NOT VISIBLE'}',
                      ),
                    ],
                  ),
                ),
              ),
            ),
          ),
        );
      }
    }

  [1]: https://pub.dev/packages/flutter_keyboard_visibility

1 个答案:

答案 0 :(得分:1)

当您在listen上调用Stream方法时,您将获得一个StreamSubscription,以后可以使用它来取消订阅。当您放置小部件或将其他小部件推到屏幕上并在弹出其他小部件时再次订阅时,可以通过以下方法取消订阅:

import 'dart:async';

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  MyApp({Key key}) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _keyboardState;
  StreamSubscription keyboardOnChaneSubscription;

  @override
  void initState() {
    super.initState();
    _keyboardState = KeyboardVisibility.isVisible;
    subscribeToKeyboardOnChange();
  }

  @override
  void dispose() {
    keyboardOnChaneSubscription.cancel();
    super.dispose();
  }
  
  void subscribeToKeyboardOnChange() {
    keyboardOnChaneSubscription =
        KeyboardVisibility.onChange.listen((bool visible) {
          setState(() {
            _keyboardState = visible;
          });
        });
  }

  void navigateToScreenA() async {
    keyboardOnChaneSubscription.cancel();
    await Navigator.push(context, MaterialPageRoute(builder: (context)=>ScreenA()));
    subscribeToKeyboardOnChange();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: KeyboardDismissOnTap(
        child: Scaffold(
          appBar: AppBar(
            title: Text('Keyboard Visibility Example'),
          ),
          body: Center(
            child: Padding(
              padding: EdgeInsets.all(24.0),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  TextField(
                    keyboardType: TextInputType.text,
                    decoration: InputDecoration(
                      labelText: 'Input box for keyboard test',
                    ),
                  ),
                  Container(height: 60.0),
                  Text(
                    'The keyboard is: ${_keyboardState ? 'VISIBLE' : 'NOT VISIBLE'}',
                  ),
                  RaisedButton(onPressed: () => navigateToScreenA())
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}