【问题标题】:Navigating from a plugin callback从插件回调导航
【发布时间】:2018-09-26 18:27:24
【问题描述】:

问题是当我想从回调导航时 - 由插件调用 - 新页面作为小部件推入我的页面内。

这是代码:

import 'dart:async';

import 'package:barcode_scan/barcode_scan.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ) );
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String barcode = "";

  @override
  initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
          appBar: new AppBar(
            title: new Text('Barcode Scanner Example'),
          ),
          body: new Center(
            child: new Column(
              children: <Widget>[
                new Container(
                  child: new MaterialButton(
                      onPressed: scan, child: new Text("Scan")),
                  padding: const EdgeInsets.all(8.0),
                ),
              ],
            ),
          ));
  }

  Future scan() async {
    try {
      String barcode = await BarcodeScanner.scan();
      print("${context}");
      Navigator.push(context, MaterialPageRoute(
          builder: (context) {
            return new BarcodePage(barcode);}
          ));

      setState(() => this.barcode = barcode);
    } on PlatformException catch (e) {
      if (e.code == BarcodeScanner.CameraAccessDenied) {
        setState(() {
          this.barcode = 'The user did not grant the camera permission!';
        });
      } else {
        setState(() => this.barcode = 'Unknown error: $e');
      }
    } on FormatException{
      setState(() => this.barcode = 'null (User returned using the "back"-button before scanning anything. Result)');
    } catch (e) {
      setState(() => this.barcode = 'Unknown error: $e');
    }
  }
}

class BarcodePage extends StatefulWidget {
  BarcodePage(String s) {
    str = s;
  }
  String str;
  @override
  State<StatefulWidget> createState() {
    return _BarcodePageState(str);
  }

}
class _BarcodePageState extends State<BarcodePage> {
    String str;

  _BarcodePageState(String s ){
    str = s;

  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar:  new AppBar(title: new Text("Bar code"),),
      body: new Text(str),
    );
  }

}

您可以在https://github.com/arashbi/flutter_barcode_reader 示例文件夹中找到该应用程序

这与我之前的问题有关,但设置更简单。

【问题讨论】:

  • 您可以尝试发布更多关于究竟是什么问题的信息吗?是视觉上的吗?我试图在没有你的插件的情况下重现这个,我没有从这段代码中看到任何奇怪的东西 - 新页面按预期出现。
  • 如果是视觉上的东西,也许记录意外行为甚至可以解释
  • 对。我不知道该怎么做,但我解决了这个问题。视觉问题是第二个页面 - 及其应用栏和所有页面 - 出现在第一页的中间,就像一个小部件。如果你能想象到

标签: flutter


【解决方案1】:

AFAI 理解问题在于,回调发生在渲染管道的中间,它会导致错误的行为。解决方案是使用Future.delayedSchedulerBinding.instance.addPostFrameCallback

这些方法导致导航发生在渲染管道之后,并且导航器可以正常工作

【讨论】:

    猜你喜欢
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多