OpenFlutter/flutter_screenutil

on 3.10.0 use flutter screenutil, when I open keyboard ,bottomsheet not build, and keyboard Obscure bottomsheet

kevin-lemon opened this issue · 16 comments

can try this code with flutter 3.10.0 and flutter_screenutil: 5.8.1

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return ScreenUtilInit(
        designSize: const Size(375, 812),
        builder: (context, child) {
          return const MaterialApp(
            home: HomePage(),
          );
        });
  }
}

class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter Tutorial'),
      ),
      body: Column(
        children: [
          Center(
            child: ElevatedButton(
              onPressed: () {
                showModalBottomSheet(
                  context: context,
                  builder: (context){
                    return Padding(
                      padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
                      child: const SizedBox(height: 200, child: TextField()),
                    );
                  },
                );
              },
              child: const Text(
                'showModalBottomSheet',
              ),
            ),
          ),
        ],
      ),
    );
  }

}

image
I test only use flutter screenutil can happend

就是当我用这个插件的时候(5.8.1最新版和5.7.0以前用的都尝试了),在3.7.11版本的flutter,是完全没问题的,但是当我升级flutter到3.10.0时,打开键盘不会触发bottomsheet的build了,导致页面无法移动被遮挡,在3.7.11是触发的,不止是bottomsheet,其他的带输入框页面似乎也有这个问题。

当使用方式二加载时不会有这个问题:
void main() async {
// Add this line
await ScreenUtil.ensureScreenSize();
runApp(MyApp());
}
...
MaterialApp(
...
builder: (ctx, child) {
ScreenUtil.init(ctx);
return Theme(
data: ThemeData(
primarySwatch: Colors.blue,
textTheme: TextTheme(bodyText2: TextStyle(fontSize: 30.sp)),
),
child: HomePage(title: 'FlutterScreenUtil Demo'),
);
},
)

me too,哈哈哈

me too,哈哈哈

我试了下,用方式二加载可以,不包裹

当使用方式二加载时不会有这个问题:
void main() async {
// Add this line
await ScreenUtil.ensureScreenSize();
runApp(MyApp());
}
...
MaterialApp(
...
builder: (ctx, child) {
ScreenUtil.init(ctx);
return Theme(
data: ThemeData(
primarySwatch: Colors.blue,
textTheme: TextTheme(bodyText2: TextStyle(fontSize: 30.sp)),
),
child: HomePage(title: 'FlutterScreenUtil Demo'),
);
},
)

useInheritedMediaQuery: true

这样也可以,但是会造成父组件不断的 rebuild

useInheritedMediaQuery: true

这样也可以,但是会造成父组件不断的 rebuild

不断rebuild也很头疼,我直接不包了,反正只是用到了计算下dp

useInheritedMediaQuery: true
这样也可以,但是会造成父组件不断的 rebuild

不断rebuild也很头疼,我直接不包了,反正只是用到了计算下dp

仔细看看源码,方法二相当于 useInheritedMediaQuery: true

useInheritedMediaQuery: true
这样也可以,但是会造成父组件不断的 rebuild

不断rebuild也很头疼,我直接不包了,反正只是用到了计算下dp

仔细看看源码,方法二相当于 useInheritedMediaQuery: true

那这个无解了?

我运行了一下demo , 输入框在底部的时候 是会弹起到键盘上方的啊
原来是bottomSheet, 试了一下 确实没有弹起 .
可以先参考一下这个写法:

showModalBottomSheet<void>(
                        context: context,
                        builder: (BuildContext context) {
                          return Container(
                            height: 200.w +
                                MediaQuery.of(context).viewInsets.bottom,
                            color: Colors.amber,
                            child: Center(
                              child: Column(
                                mainAxisAlignment: MainAxisAlignment.center,
                                mainAxisSize: MainAxisSize.min,
                                children: <Widget>[
                                  const Text('Modal BottomSheet'),
                                  Spacer(),
                                  TextField(),
                                  ElevatedButton(
                                    child: const Text('Close BottomSheet'),
                                    onPressed: Navigator.of(context).pop,
                                  ),
                                  SizedBox(
                                      height: MediaQuery.of(context)
                                          .viewInsets
                                          .bottom),
                                ],
                              ),
                            ),
                          );
                        },
                      );

不会多次调用build, 也会在弹起键盘时把输入框顶起来

我运行了一下demo , 输入框在底部的时候 是会弹起到键盘上方的啊 原来是bottomSheet, 试了一下 确实没有弹起 . 可以先参考一下这个写法:

showModalBottomSheet<void>(
                        context: context,
                        builder: (BuildContext context) {
                          return Container(
                            height: 200.w +
                                MediaQuery.of(context).viewInsets.bottom,
                            color: Colors.amber,
                            child: Center(
                              child: Column(
                                mainAxisAlignment: MainAxisAlignment.center,
                                mainAxisSize: MainAxisSize.min,
                                children: <Widget>[
                                  const Text('Modal BottomSheet'),
                                  Spacer(),
                                  TextField(),
                                  ElevatedButton(
                                    child: const Text('Close BottomSheet'),
                                    onPressed: Navigator.of(context).pop,
                                  ),
                                  SizedBox(
                                      height: MediaQuery.of(context)
                                          .viewInsets
                                          .bottom),
                                ],
                              ),
                            ),
                          );
                        },
                      );

不会多次调用build, 也会在弹起键盘时把输入框顶起来

用我的代码,外面screenutils包裹,我这边必现,在3.10.0的flutter版本

+1

flutter/flutter#126585

我是在Flutter的github上面找到这个问题的,我也很奇怪,之前一直没问题,现在就出这种问题,我一开始也是怀疑第三方库,我一个一个试,最后真的试到万念俱灰了,然后就真的试出来了...

flutter/flutter#126585

我是在Flutter的github上面找到这个问题的,我也很奇怪,之前一直没问题,现在就出这种问题,我一开始也是怀疑第三方库,我一个一个试,最后真的试到万念俱灰了,然后就真的试出来了...

现在你咋解决了?

flutter/flutter#126585
我是在Flutter的github上面找到这个问题的,我也很奇怪,之前一直没问题,现在就出这种问题,我一开始也是怀疑第三方库,我一个一个试,最后真的试到万念俱灰了,然后就真的试出来了...

现在你咋解决了?

就是用了useInheritedMediaQuery: true就没问题,不过有一个点要注意的是,你要看清楚的inputTextfiled是否嵌在Scaffold,因为Scaffold在默认状态下会帮你自动适配键盘弹起的情况...

很抱歉出现这样的问题,
现在可以先升级到5.8.2, 将useInheritedMediaQuery默认值改为true了

很抱歉出现这样的问题, 现在可以先升级到5.8.2, 将useInheritedMediaQuery默认值改为true了

我这边出现只要键盘弹起来,当前所有 UI 视图栈(当前页外面的所有页面)在键盘弹起或者消失的过程中,一直 rebuild 的情况

很抱歉出现这样的问题, 现在可以先升级到5.8.2, 将useInheritedMediaQuery默认值改为true了

请问有解决办法吗?我不需要一直 rebuild。

很抱歉出现这样的问题, 现在可以先升级到5.8.2, 将useInheritedMediaQuery默认值改为true了

请问有解决办法吗?我不需要一直 rebuild。

我的项目可以这样解决,你也可以试试,一定记得 useInheritedMediaQuery 设置为 false。

#485