Android Listview.builder在另一个小部件上定位小部件

Android Listview.builder在另一个小部件上定位小部件,android,ios,flutter,user-interface,android-listview,Android,Ios,Flutter,User Interface,Android Listview,我正在尝试制作一个像Instagram这样的应用程序。但由于其他图片的原因,我无法完全查看缩放的图片 代码: List colors = [ Colors.green, Colors.blue, Colors.red, ]; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("De

我正在尝试制作一个像Instagram这样的应用程序。但由于其他图片的原因,我无法完全查看缩放的图片

代码:

List colors = [
    Colors.green,
    Colors.blue,
    Colors.red,
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Demo"),
      ),
      body: ListView.builder(
        itemCount: 3,
        itemBuilder: (_, int index) {
          TransformationController controller = TransformationController();
          return Container(
            child: InteractiveViewer(
              transformationController: controller,
              onInteractionEnd: (_) {
                setState(() {
                  controller.toScene(Offset.zero);
                });
              },
              child: ColorFiltered(
                colorFilter: ColorFilter.mode(colors[index], BlendMode.color),
                child: FlutterLogo(),
              ),
            ),
            height: 200,
            width: 200,
          );
        },
      ),
    );
  }


注意:由于listview.builder的原因,我无法使用stack之类的小部件

您可以使用可见性小部件或不透明度小部件来更改当前未平移图像的可见性。请看下面的代码,我正在使用AnimatedOpacity,这样图像的消失看起来不会太突然,但您也可以使用不透明小部件

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text("Flutter Demo")),
        body: MyStatefulWidget(),
      ),
    );
  }
}

class MyStatefulWidget extends StatefulWidget {
  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  static List colors = [
    Colors.green,
    Colors.blue,
    Colors.red,
  ];
  final List<double> _opacity = List.generate(colors.length, (index) => 1);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Demo"),
      ),
      body: ListView.builder(
        itemCount: 3,
        itemBuilder: (_, int index) {
          final TransformationController controller =
              TransformationController();
          return AnimatedOpacity(
            opacity: _opacity[index],
            duration: const Duration(milliseconds: 100),
            child: Container(
              child: InteractiveViewer(
                transformationController: controller,
                onInteractionStart: (details) {
                  for (int i = 0; i < _opacity.length; i++) {
                    _opacity[i] = i == index ? 1 : 0;
                  }
                  setState(() {});
                },
                onInteractionEnd: (_) {
                  setState(() {
                    _opacity.fillRange(0, _opacity.length, 1);
                    controller.toScene(Offset.zero);
                  });
                },
                child: ColorFiltered(
                  colorFilter: ColorFilter.mode(colors[index], BlendMode.color),
                  child: const FlutterLogo(),
                ),
              ),
              height: 200,
              width: 200,
            ),
          );
        },
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
appBar:appBar(标题:常量文本(“颤振演示”),
正文:MyStatefulWidget(),
),
);
}
}
类MyStatefulWidget扩展了StatefulWidget{
@凌驾
_MyStatefulWidgetState createState()=>\u MyStatefulWidgetState();
}
类_MyStatefulWidgetState扩展状态{
静态列表颜色=[
颜色,绿色,
颜色,蓝色,
颜色,红色,
];
最终列表_不透明度=List.generate(colors.length,(index)=>1);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:常量文本(“演示”),
),
正文:ListView.builder(
物品计数:3,
itemBuilder:(\ux,int索引){
最终转换控制器=
TransformationController();
返回能力(
不透明度:_不透明度[索引],
持续时间:常数持续时间(毫秒:100),
子:容器(
子:InteractiveViewer(
转换控制器:控制器,
onInteractionStart:(详细信息){
对于(int i=0;i<\u opacity.length;i++){
_不透明度[i]=i==指数?1:0;
}
setState((){});
},
onInteractionEnd:(){
设置状态(){
_不透明度.fillRange(0,_opacity.length,1);
控制器。toScene(偏移量为零);
});
},
孩子:颜色过滤(
colorFilter:colorFilter.mode(颜色[索引]、BlendMode.color),
子项:const flatterlogo(),
),
),
身高:200,
宽度:200,
),
);
},
),
);
}
}

您可以使用可见性小部件或不透明度小部件更改当前未平移图像的可见性。请看下面的代码,我正在使用AnimatedOpacity,这样图像的消失看起来不会太突然,但您也可以使用不透明小部件

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text("Flutter Demo")),
        body: MyStatefulWidget(),
      ),
    );
  }
}

class MyStatefulWidget extends StatefulWidget {
  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  static List colors = [
    Colors.green,
    Colors.blue,
    Colors.red,
  ];
  final List<double> _opacity = List.generate(colors.length, (index) => 1);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Demo"),
      ),
      body: ListView.builder(
        itemCount: 3,
        itemBuilder: (_, int index) {
          final TransformationController controller =
              TransformationController();
          return AnimatedOpacity(
            opacity: _opacity[index],
            duration: const Duration(milliseconds: 100),
            child: Container(
              child: InteractiveViewer(
                transformationController: controller,
                onInteractionStart: (details) {
                  for (int i = 0; i < _opacity.length; i++) {
                    _opacity[i] = i == index ? 1 : 0;
                  }
                  setState(() {});
                },
                onInteractionEnd: (_) {
                  setState(() {
                    _opacity.fillRange(0, _opacity.length, 1);
                    controller.toScene(Offset.zero);
                  });
                },
                child: ColorFiltered(
                  colorFilter: ColorFilter.mode(colors[index], BlendMode.color),
                  child: const FlutterLogo(),
                ),
              ),
              height: 200,
              width: 200,
            ),
          );
        },
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
appBar:appBar(标题:常量文本(“颤振演示”),
正文:MyStatefulWidget(),
),
);
}
}
类MyStatefulWidget扩展了StatefulWidget{
@凌驾
_MyStatefulWidgetState createState()=>\u MyStatefulWidgetState();
}
类_MyStatefulWidgetState扩展状态{
静态列表颜色=[
颜色,绿色,
颜色,蓝色,
颜色,红色,
];
最终列表_不透明度=List.generate(colors.length,(index)=>1);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:常量文本(“演示”),
),
正文:ListView.builder(
物品计数:3,
itemBuilder:(\ux,int索引){
最终转换控制器=
TransformationController();
返回能力(
不透明度:_不透明度[索引],
持续时间:常数持续时间(毫秒:100),
子:容器(
子:InteractiveViewer(
转换控制器:控制器,
onInteractionStart:(详细信息){
对于(int i=0;i<\u opacity.length;i++){
_不透明度[i]=i==指数?1:0;
}
setState((){});
},
onInteractionEnd:(){
设置状态(){
_不透明度.fillRange(0,_opacity.length,1);
控制器。toScene(偏移量为零);
});
},
孩子:颜色过滤(
colorFilter:colorFilter.mode(颜色[索引]、BlendMode.color),
子项:const flatterlogo(),
),
),
身高:200,
宽度:200,
),
);
},
),
);
}
}

感谢您的回答,您的意见非常好,但我希望缩放后的图像位于其他可见图像之上。谢谢你的回复。谢谢你的回答,你的意见很好,但我希望缩放后的图像位于其他可见图像之上。谢谢你的回复。