键盘在我的颤振应用程序中立即出现和消失

如何解决键盘在我的颤振应用程序中立即出现和消失

我在我的 flutter 应用程序中使用了 BottomNavigationBar,其中保存了每个选项卡的状态,并且我还使我的 BottomNavigationBar 除了具有文本输入的屏幕外可见。我做到了,但是当我想添加文本输入时出现了一个大问题。我无法专注于我的键盘。它会在不到一秒钟的时间内出现并返回。已经看到了一些人的解决方案,但它对我不起作用。我真的很高兴在这里得到帮助以修复键盘故障。谢谢

当我点击输入文本字段时,这会出现在我的终端上

    W/IInputConnectionWrapper(29345): getSelectedText on inactive InputConnection
W/IInputConnectionWrapper(29345): requestCursorAnchorInfo on inactive InputConnection
3
W/IInputConnectionWrapper(29345): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(29345): getSelectedText on inactive InputConnection
D/InputConnectionAdaptor(29345): The input method toggled cursor monitoring on
I/SurfaceView(29345): updateWindow -- setFrame,this = io.flutter.embedding.android.FlutterSurfaceView{f394ae6 V.E...... ......I. 0,0-720,1204}

这是我的 flutter 医生,如果您需要更多文件,请告诉我。谢谢。

Doctor summary (to see all details,run flutter doctor -v):
[√] Flutter (Channel stable,2.0.6,on Microsoft Windows [Version 10.0.19043.985],locale en-US)
[√] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[X] Chrome - develop for the web (Cannot find Chrome executable at .\Google\Chrome\Application\chrome.exe)
    ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable.
[√] Android Studio (version 4.1.0)
[√] VS Code (version 1.56.2)
[√] Connected device (2 available)
> 

这是我的主页类文件

    import 'package:flutter/material.dart';
    import 'package:my_time_tracker/app/home/account/account_page.dart';
    import 'package:my_time_tracker/app/home/entries/entries_page.dart';
    import 'package:my_time_tracker/app/home/home_scaffold.dart';
    import 'package:my_time_tracker/app/home/jobs/edit_job_page.dart';
    import 'package:my_time_tracker/app/home/tab_item.dart';
    import 'jobs/jobs_page.dart';



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

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

class _HomePageState extends State<HomePage> {
 TabItem _currentTab = TabItem.jobs;
 int _selectedIndex = 0;

 List<GlobalKey<NavigatorState>> navigatorKeys = [
 GlobalKey<NavigatorState>(),GlobalKey<NavigatorState>(),];

  Map<int,Widget> get widgets {
   return {
    0: JobsPage(),1: EntriesPage.create(context),2: AccountPage(),};
 }


 void _onItemTapped(int index) {
   if (_selectedIndex == index) {
   navigatorKeys[index].currentState.popUntil((route) => route.isFirst);
    } else {
     setState(() {
    _selectedIndex = index;
   });
 }
}

 @override
 Widget build(BuildContext context) {
 return WillPopScope(
   onWillPop: () async {
     final isFirstRouteInCurrentTab =
         !await navigatorKeys[_selectedIndex].currentState.maybePop();
     print(
        'isFirstrouteInCurrentTab:' + isFirstRouteInCurrentTab.toString());
     return isFirstRouteInCurrentTab;
   },child: HomeScaffold(
     navigatorKeys: navigatorKeys,currentTabItem: _currentTab,onSelectTab: _onItemTapped,currentIndex: _selectedIndex,widget: widgets,),);
 }
}

这是我的 HomeScaffold 类

import 'package:flutter/material.dart';
import 'package:my_time_tracker/app/home/account/account_page.dart';
import 'package:my_time_tracker/app/home/entries/entries_page.dart';
import 'package:my_time_tracker/app/home/jobs/jobs_page.dart';
import 'package:my_time_tracker/app/home/tab_item.dart';
import 'package:my_time_tracker/common_widgets/custom_text_style.dart';

class HomeScaffold extends StatefulWidget {
  const HomeScaffold({
    Key key,@required this.currentTabItem,@required this.onSelectTab,@required this.navigatorKeys,@required this.currentIndex,@required this.widget,}) : super(key: key);

  final TabItem currentTabItem;
  final int currentIndex;
  final ValueChanged<int> onSelectTab;
  final Map<int,Widget> widget;

  final List<GlobalKey<NavigatorState>> navigatorKeys;

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

class _HomeScaffoldState extends State<HomeScaffold> {
 

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,bottomNavigationBar: BottomNavigationBar(
        items: [
          _buildItem(TabItem.jobs),_buildItem(TabItem.entries),_buildItem(TabItem.account),],type: BottomNavigationBarType.shifting,onTap: (index) => widget.onSelectTab(index),selectedItemColor: Colors.teal,unselectedItemColor: Colors.grey[700].withOpacity(.60),backgroundColor: Colors.white,elevation: 5.0,currentIndex: widget.currentIndex,showUnselectedLabels: true,selectedLabelStyle: CustomTextStyles.textStyleBold(),body: Stack(
        children: [
          _buildOffStageNavigator(0),_buildOffStageNavigator(1),_buildOffStageNavigator(2),);
  }

  BottomNavigationBarItem _buildItem(TabItem tabItem) {
    final itemData = TabItemData.allTabs[tabItem];
    return BottomNavigationBarItem(
      icon: Icon(itemData.icon),label: itemData.label,backgroundColor: itemData.backgroundColor,);
  }

  Map<String,WidgetBuilder> _routeBuilders(BuildContext context,int index) {
    return {
      '/': (context) {
        return [
          JobsPage(),EntriesPage.create(context),AccountPage(),].elementAt(index);
      }
    };
  }

  Widget _buildOffStageNavigator(int index) {
    var routeBuilders = _routeBuilders(context,index);

    return Offstage(
      offstage: widget.currentIndex != index,child: Navigator(
        key: widget.navigatorKeys[index],onGenerateRoute: (routeSettings) {
          return MaterialPageRoute(
            builder: (context) => routeBuilders[routeSettings.name](context),);
        },);
  }
}

这是我的 TabItem 类

import 'package:flutter/material.dart';

enum TabItem { jobs,entries,account }

class TabItemData {
  const TabItemData({
    @required this.label,@required this.icon,this.backgroundColor,});

  final String label;
  final IconData icon;
  final Color backgroundColor;

  static const Map<TabItem,TabItemData> allTabs = {
    TabItem.jobs: TabItemData(
      label: 'Jobs',icon: Icons.work,//backgroundColor: Colors.white,TabItem.entries: TabItemData(
      label: 'Entries',icon: Icons.view_headline,//backgroundColor: Colors.tealAccent,TabItem.account: TabItemData(
      label: 'Account',icon: Icons.account_circle,//backgroundColor: Colors.lightBlueAccent,};
}

这是我的 EditJob 页面,其中包含文本输入

import 'package:flutter/material.dart';
import 'package:my_time_tracker/common_widgets/custom_text_style.dart';
//import 'package:my_time_tracker/common_widgets/firebase_exception_alert_dialog.dart';
import 'package:my_time_tracker/common_widgets/form_submit_button.dart';
import 'package:my_time_tracker/common_widgets/platform_alert_dialog.dart';
import 'package:my_time_tracker/common_widgets/show_snack_bar.dart';
import 'package:my_time_tracker/services/database.dart';
import 'package:provider/provider.dart';

import '../models/job.dart';

class EditJobPage extends StatefulWidget {
  final Database database;
  final Job job;
  final ValueChanged<int> onPush;

  const EditJobPage({Key key,@required this.database,this.job,this.onPush})
      : super(key: key);

  static Future<void> show(BuildContext context,{Job job}) async {
    final database = Provider.of<Database>(context,listen: false);
    await Navigator.of(context,rootNavigator: true).push(MaterialPageRoute(
      fullscreenDialog: true,builder: (context) => EditJobPage(
        database: database,job: job,));
  }

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

class _EditJobPageState extends State<EditJobPage> {
  final _formKey = GlobalKey<FormState>();

  String _name;
  int _ratePerHour;
  bool isLoading = false;

  @override
  void initState() {
    super.initState();
    if (widget.job != null) {
      _name = widget.job.name;
      _ratePerHour = widget.job.ratePerHour;
    }
  }

  bool _validateAndSaveForm() {
    final form = _formKey.currentState;
    if (form.validate()) {
      form.save();
      return true;
    }
    return false;
  }

  String get scaffoldContent {
    if (widget.job != null) {
      return '${widget.job.name} updated successfully.';
    } else {
      return '$_name added successfully.';
    }
  }

  @override
  Widget build(BuildContext context) {
    Size size = MediaQuery.of(context).size;
    return Scaffold(
      appBar: AppBar(
        iconTheme: IconThemeData(color: Colors.teal),title: Text(
          widget.job == null ? 'New Job' : 'Edit Job',style: CustomTextStyles.textStyleTitle(
            fontSize: size.height * 0.035,color: Colors.teal,centerTitle: true,elevation: 0.0,body: _buildContent(),);
  }

  InputDecoration _buildInputDecoration(
    String labelText,IconData icon,bool value,) {
    Size size = MediaQuery.of(context).size;
    return InputDecoration(
      labelText: labelText,labelStyle: CustomTextStyles.textStyleBold(fontSize: size.height * 0.025),icon: Icon(
        icon,color: Colors.teal[700],size: size.height * 0.05,enabled: value,);
  }

  Widget _buildContent() {
    return SingleChildScrollView(
      child: Padding(
        padding: const EdgeInsets.all(16.0),child: Card(
          elevation: 5.0,child: Column(
            children: [
              Padding(
                padding: const EdgeInsets.all(16.0),child: _buildForm(),SizedBox(
                height: 5.0,SizedBox(
                width: MediaQuery.of(context).size.width * 0.62,child: FormSubmitButton(
                  onPressed: isLoading ? null : _submit,text: 'Save',SizedBox(
                height: 15.0,);
  }

  Widget _buildForm() {
    return Form(
      key: _formKey,autovalidateMode: AutovalidateMode.onUserInteraction,child: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,children: _buildFormChildren(),);
  }

  List<Widget> _buildFormChildren() {
    return [
      _buildJobNameField(),_buildJobRateField(),SizedBox(
        height: 15.0,)
    ];
  }

  Widget _buildJobNameField() {
    return TextFormField(
      decoration: _buildInputDecoration(
        'Job name',Icons.work,isLoading == false,initialValue: _name,validator: (value) =>
          value == null || value.isEmpty ? 'Name can\'t be empty' : null,textInputAction: TextInputAction.next,textCapitalization: TextCapitalization.words,onSaved: (value) => _name = value,);
  }

  Widget _buildJobRateField() {
    return TextFormField(
      decoration: _buildInputDecoration(
        'Rate Per Hour',Icons.attach_money,initialValue: _ratePerHour != null ? '$_ratePerHour' : '',keyboardType:
          TextInputType.numberWithOptions(decimal: false,signed: false),onSaved: (value) => _ratePerHour = int.tryParse(value) ?? 0,onEditingComplete: _submit,);
  }

  Future<void> _submit() async {
    //Future.delayed(Duration(seconds: 5));
    if (_validateAndSaveForm()) {
      print('Error doesnt occur here0');
      setState(() {
        isLoading = true;
      });
      print('Error doesnt occur here1');
      try {
        final jobs = await widget.database
            .jobsStream()
            .first
            .onError((error,stackTrace) {
          return Future.error(error);
        });
        print('Error doesnt occur here2');
        final allNames = jobs.map((job) => job.name).toList();
        if (widget.job != null) {
          allNames.remove(widget.job.name);
        }
        if (allNames.contains(_name)) {
          PlatformAlertDialog(
            title: 'Job already exist',content: 'Please use a different job name.',defaultActionText: 'Ok',).show(context);
        } else {
          final id = widget.job?.id ?? documentIdFromCurrentDate();
          final job = Job(
            id: id,name: _name,ratePerHour: _ratePerHour,);
          await widget.database.setJob(job);
          print('Error doesnt occur here5');
          Navigator.of(context).pop();
          MyCustomSnackBar(
            enabled: widget.job == null ? true : false,text: scaffoldContent,onPressed: () => widget.database.deleteJob(job),).show(context);
        }
      } catch (e) {
        // FirebaseExceptionAlertDialog(title: 'Operation Failed',exception: e)
        //     .show(context);
        print(e);
      }
      setState(() {
        isLoading = false;
      });
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res