flutter - 如何获取小部件的位置,以便在加载时定位另一个小部件

标签 flutter dart

我找到了几种方法来解释如何在按下按钮等时获取小部件的位置,但是每当我尝试获取小部件的位置时(在initState,didChangeDependencies期间或在主小部件构建方法之后),以便进行定位相对于第一个的另一个小部件,我得到findRenderObject was called on null ...

import 'package:flutter/material.dart';

class Example extends StatefulWidget {
  @override
  _ExampleState createState() => _ExampleState();
}

class _ExampleState extends State<Example> {
  GlobalKey _key = GlobalKey();
  RenderBox renderBox;

  void _getWidgetPosition(){
     renderBox = _key.currentContext.findRenderObject();
    final position = renderBox.localToGlobal(Offset.zero);
    print(position);
  }

  @override
  void initState(){
    super.initState();
// Getting the position doesn't work here
  }

  @override
  void didChangeDependencies(){
    super.didChangeDependencies();
// Getting the position doesn't work here
  }

  @override
  Widget build(BuildContext context) {
// Getting the position doesn't work here
    return Scaffold(
      floatingActionButton: Row(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        children: <Widget>[
          FloatingActionButton(onPressed: () => _getWidgetPosition()),
          FloatingActionButton(
            onPressed: null,
            key: _key,
          ),
          FloatingActionButton(onPressed: null)
        ],
      ),
      body: Stack(
        children: <Widget>[
          Positioned(
            // This is where I would like to use the middle FAB's position
            // left: ,
            // top: ,
            child: Container()),
        ],
      ),
    );
  }
}

最佳答案

您可以在下面复制粘贴运行完整代码
您可以在addPostFrameCallback中使用initState程式码片段

class _ExampleState extends State<Example> {
  GlobalKey _key = GlobalKey();
  RenderBox renderBox;
  Offset position = Offset.zero;

  void _getWidgetPosition() {
    renderBox = _key.currentContext.findRenderObject();
    position = renderBox.localToGlobal(Offset.zero);
    print(position);
    setState(() {});
  }

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      _getWidgetPosition();
    });
工作演示
enter image description here
完整的代码
import 'package:flutter/material.dart';

class Example extends StatefulWidget {
  @override
  _ExampleState createState() => _ExampleState();
}

class _ExampleState extends State<Example> {
  GlobalKey _key = GlobalKey();
  RenderBox renderBox;
  Offset position = Offset.zero;

  void _getWidgetPosition() {
    renderBox = _key.currentContext.findRenderObject();
    position = renderBox.localToGlobal(Offset.zero);
    print(position);
    setState(() {});
  }

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      _getWidgetPosition();
    });
// Getting the position doesn't work here
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
// Getting the position doesn't work here
  }

  @override
  Widget build(BuildContext context) {
    print(position.dx);
// Getting the position doesn't work here
    return Scaffold(
      floatingActionButton: Row(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        children: <Widget>[
          FloatingActionButton(onPressed: () => _getWidgetPosition()),
          FloatingActionButton(
            onPressed: null,
            key: _key,
          ),
          FloatingActionButton(onPressed: null)
        ],
      ),
      body: Stack(
        children: <Widget>[
          Positioned(
              left: position.dx,
              top: position.dy,
              child: Container(
                color: Colors.orange,
                width: 100,
                height: 100,
              )),
        ],
      ),
    );
  }
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Example(),
    );
  }
}

关于flutter - 如何获取小部件的位置,以便在加载时定位另一个小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63373282/

相关文章:

firebase - 类型 '_InternalLinkedHashMap<String, dynamic>' 不是类型转换中类型 'TodoModel' 的子类型

mysql - 无法将来自 JSON 的 Blob 转换为文件

带有 flutter_bloc 的 Flutter testWidgets - 测试仅在一起执行时失败

url - 如何在 Dart 中以正确的方式重定向和重新加载?

firebase - Flutter:Firebase 存储在 Release模式下不上传文件

flutter - 可滚动屏幕- flutter

dart - ExpansionTile 不保持状态

flutter - 如何在MacOS中安装两种不同版本的 Dart ,用于 flutter 和 Aqueduct

dart - 更改音频播放速度

dart - 如何在 Dart 中实现动态属性?