我正在使用此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
答案 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())
],
),
),
),
),
),
);
}
}