Native Android App中的颤振,后按不起作用

Posted

技术标签:

【中文标题】Native Android App中的颤振,后按不起作用【英文标题】:Flutter in Native Android App, back pressed not working 【发布时间】:2020-12-07 13:57:54 【问题描述】:

我阅读了很多关于此的主题,但没有任何效果,并且与我的上下文完全相同。

我正在尝试在原生 android 项目中添加颤动视图,我有一个原生 Activity 可以启动颤动片段。这个颤振片段包含 2 个视图(firstScreen 和 secondScreen)。 FirstScreen 在按下按钮时重定向到 SecondScreen,并且 secondScreen 在按下按钮时弹回第一个屏幕。到目前为止一切正常。

但是当我在第二个屏幕上时,我想在按下设备后退按钮时返回 firstScreen,但颤动 Fragment 已关闭,我又回到了本机 Activity。

当我单独运行flutter模块时,后面的过程看起来不错。

以下是一些截图:

这里有一些代码:

在原生 MainActivity 中

override fun startFlutterModule() 
    val newFlutterFragment: FlutterFragment = FlutterFragment.createDefault()
    supportFragmentManager.beginTransaction()
        .replace(
            fragmentContainerId,
            newFlutterFragment,
            TAG_FLUTTER_FRAGMENT
        )
        .addToBackStack(TAG_FLUTTER_FRAGMENT)
        .commit()

基本 Flutter 应用

void main() => runApp(MyApp());

class MyApp extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return new MaterialApp(
      routes: 
        '/first': (context) => FirstScreen(),
        '/second': (context) => SecondScreen(),
      ,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: FirstScreen(),
    );
  

第一个 Flutter 屏幕

class FirstScreen extends StatefulWidget 
  @override
  _FirstScreenState createState() => _FirstScreenState();


class _FirstScreenState extends State<FirstScreen> 

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      backgroundColor: Colors.white,
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              "First Screen",
              style: TextStyle(
                fontSize: 30.0,
                fontWeight: FontWeight.w600,
              ),
            ),
            Padding(
              padding: EdgeInsets.all(10.0),
              child: RaisedButton(
                padding: EdgeInsets.symmetric(
                  horizontal: 20.0,
                  vertical: 10.0,
                ),
                onPressed: ()
                  Navigator.pushNamed(context, '/second');
                ,
                child: Text(
                  "Screen 2",
                  style: TextStyle(
                    color: Colors.white,
                    fontSize: 20.0,
                  ),
                ),
              ),
            )
          ],
        ),
      ),
    );
  

第二个颤振屏幕

class SecondScreen extends StatefulWidget 
  @override
  _SecondScreenState createState() => _SecondScreenState();


class _SecondScreenState extends State<SecondScreen> 
  @override
  Widget build(BuildContext context) 
    return new WillPopScope(
        onWillPop: () async 
          Navigator.pop(context);
          return Future.value(false);
        ,
        child: Scaffold(
          backgroundColor: Colors.white,
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  "Second Screen",
                  style: TextStyle(
                    fontSize: 30.0,
                    fontWeight: FontWeight.w600,
                  ),
                ),
                Padding(
                  padding: EdgeInsets.all(10.0),
                  child: RaisedButton(
                    padding: EdgeInsets.symmetric(
                      horizontal: 20.0,
                      vertical: 10.0,
                    ),
                    onPressed: () 
                      Navigator.pop(context);
                    ,
                    child: Text(
                      "Screen 1",
                      style: TextStyle(
                        color: Colors.white,
                        fontSize: 20.0,
                      ),
                    ),
                  ),
                )
              ],
            ),
          ),
        )
    );
  

【问题讨论】:

【参考方案1】:

从您的原生活动调用 FlutterFragment 的 onBackPressed() 方法。

 override fun onBackPressed() 

    _flutterFragment.onBackPressed()
 

【讨论】:

以上是关于Native Android App中的颤振,后按不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android Native APP开发笔记:多线程编程

react-native android中的gradlew assembleRelease命令未生成app-release.apk

我如何将颤振项目迁移到 androidx:任务“:app:preDebugBuild”的执行失败。 > Android 依赖 'androidx.versionedparcelable

颤振:无法构建android apk

如何远程加载 react-native(Android) 包

颤振没有运行?