Flutter:问题收录

文章目录

  • Missing Xcode dependency: Python module "six"
    • 参考
  • Navigator operation requested with a context that does not include a Navigator
    • 原因
  • Scaffold.of() called with a context that does not contain a Scaffold.
    • 原因
  • Waiting for another flutter command to release the startup lock

Missing Xcode dependency: Python module “six”

按照建议使用pip install sixsudo easy_install six没用,使用python2.x -m pip install six或者 brew reinstall python@2
pip install six解决。

参考

Missing xcode dependency: Python module “six”

Navigator operation requested with a context that does not include a Navigator

在写页面跳转的时候报出了该错误:

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Test',
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text("Flutter Test"),
        ),
        body: new Column(
          children: [
            new RaisedButton(
              onPressed: () {
                Navigator.push(
                    context,
                    new MaterialPageRoute(
                        builder: (context) => new BasicWidget()));
              },
              child: new Text('基本组件'),
            )
          ],
        ),
      ),
    );
  }
}

修改为以下即可,把Scafford独立出widget出来。

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Test',
      home: new HomeWidget(),
    );
  }
}

class HomeWidget extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Flutter Text"),
      ),
      body: new Column(
        children: [
          new RaisedButton(
            onPressed: () {
              Navigator.push(
                context,
                new MaterialPageRoute(
                    builder: (context) => new BasicWidget()),
              );
            },
            child: new Text('基本组件'),
          )
        ],
      ),
    );
  }
}

原因

  1. BuildContext-class
  2. Flutter by Example BuildContext Class
  3. What does BuildContext do in Flutter?

Scaffold.of() called with a context that does not contain a Scaffold.

调用Scaffold.of(context).showSnackBar(snackBar);的时候报错:

I/flutter (24518): The following assertion was thrown while handling a gesture:
I/flutter (24518): Scaffold.of() called with a context that does not contain a Scaffold.
I/flutter (24518): No Scaffold ancestor could be found starting from the context that was passed to Scaffold.of(). This
I/flutter (24518): usually happens when the context provided is from the same StatefulWidget as that whose build
I/flutter (24518): function actually creates the Scaffold widget being sought.
I/flutter (24518): There are several ways to avoid this problem. The simplest is to use a Builder to get a context that
I/flutter (24518): is “under” the Scaffold. For an example of this, please see the documentation for Scaffold.of():
I/flutter (24518): https://docs.flutter.io/flutter/material/Scaffold/of.html
I/flutter (24518): A more efficient solution is to split your build function into several widgets. This introduces a
I/flutter (24518): new context from which you can obtain the Scaffold. In this solution, you would have an outer widget
I/flutter (24518): that creates the Scaffold populated by instances of your new inner widgets, and then in these inner
I/flutter (24518): widgets you would use Scaffold.of().
I/flutter (24518): A less elegant but more expedient solution is assign a GlobalKey to the Scaffold, then use the
I/flutter (24518): key.currentState property to obtain the ScaffoldState rather than using the Scaffold.of() function.
I/flutter (24518): The context used was:
I/flutter (24518): BasicWidget

class BasicWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    return new Scaffold(
        appBar: new AppBar(
          title: new Text("Basic Widget"),
        ),
        body: new Column(
          children: [
            new RaisedButton(
              onPressed: () {
                final snackBar = new SnackBar(
                  content: new Text("这是一个Snackbar"),
                  action: new SnackBarAction(
                      label: "Undo",
                      onPressed: (){

                  }),
                );
                Scaffold.of(context).showSnackBar(snackBar);
              },
              child: new Text("显示Snackbar"),
            )
          ],
        ));
  }
}

改成:

class BasicWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    return new Scaffold(
        appBar: new AppBar(
          title: new Text("Basic Widget"),
        ),
    body: new Builder(builder: (BuildContext context){
      return new Column(
                  children: [
            new RaisedButton(
              onPressed: () {
                final snackBar = new SnackBar(
                  content: new Text("这是一个Snackbar"),
                  action: new SnackBarAction(
                      label: "Undo",
                      onPressed: (){

                  }),
                );
                Scaffold.of(context).showSnackBar(snackBar);
              },
              child: new Text("显示Snackbar"),
            )
          ],
      );
    }),
    );
  }
}

或者我们也可以把Column抽出来:

class BasicWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: new Text("Basic Widget"),
        ),
        body: new BasicColumnWidget());
  }
}

class BasicColumnWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return new Column(
      children: [
        new RaisedButton(
          onPressed: () {
            final snackBar = new SnackBar(
              content: new Text("这是一个Snackbar"),
              action: new SnackBarAction(label: "Undo", onPressed: () {}),
            );
            Scaffold.of(context).showSnackBar(snackBar);
          },
          child: new Text("显示Snackbar"),
        )
      ],
    );
  }
}

原因

of method

Waiting for another flutter command to release the startup lock

终端使用命令flutter packages pub build_runner watch


待续

你可能感兴趣的:(flutter)