有没有办法在颤振中显示文本内的图像
Is there a way to show image inside text in flutter
我有这段代码可以在 flutter 中显示文本中的图像,但是当我使用 ImageShader 时。
我收到这个错误
方法 'asset' 没有为类型 'Image' 定义。尝试将名称更正为现有方法的名称,或定义名为 'asset'
的方法
我也提到过这个Repo。这个 repo link 是在 Whosebug 上关于 ImageShader 的先前问题中给出的。
我知道“dart:ui”不包含任何资产方法。所以我使用了 Image.asset 但是当我使用这个方法时我得到了这个错误。
The argument type 'Image (where Image is defined in
/Users/username/Developement/flutter/packages/flutter/lib/src/widgets/image.dart)'
can't be assigned to the parameter type 'Image (where Image is defined
in
/Users/username/Developement/flutter/bin/cache/pkg/sky_engine/lib/ui/painting.dart)'
Link to the similar question asked on Whosebug
import 'dart:ui' as ui;
class _MyAppState extends State<MyApp> {
Float64List matrix4 = new Matrix4.identity().storage;
ui.Image img;
Future<ui.Image> getImage() async{
img = await ui.Image.asset("assets/images/ob_girl_cropped.png"); // This Line Is showing error. Please Help.
}
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: Scaffold(
body: Center(
child: FutureBuilder(
future: getImage(),
builder: (context, snapshot)
{
if(snapshot.hasData){
return Text(
'Greetings, planet!',
style: TextStyle(
fontSize: 40,
foreground: Paint()
..shader = ImageShader(
img,
TileMode.clamp,
TileMode.clamp,
matrix4),
),
);
}
else{
return CircularProgressIndicator();
}
},
),
),
),
);
}
}
两个问题:
- 加载图像的方式,我写了一个
loadImageFromFile
辅助函数
- 你不应该把
getImage()
直接放在future
字段中,因为每次重建页面时flutter都会创建一个新的未来(所以多次加载图像)
完整代码:
import 'dart:typed_data';
import 'package:flutter/services.dart' show rootBundle;
import 'package:flutter/material.dart';
import 'dart:ui' as ui;
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Float64List matrix4 = new Matrix4.identity().storage;
Future<ui.Image> imgFuture;
// New helper function
Future<ui.Image> loadImageFromFile(String path) async {
var fileData = Uint8List.sublistView(await rootBundle.load(path));
return await decodeImageFromList(fileData);
}
@override
void initState() {
imgFuture = loadImageFromFile("assets/images/ob_girl_cropped.png"); // Works now
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: Scaffold(
body: Center(
child: FutureBuilder(
future: imgFuture,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(
'Greetings, planet!',
style: TextStyle(
fontSize: 40,
foreground: Paint()..shader = ImageShader(snapshot.data, TileMode.clamp, TileMode.clamp, matrix4),
),
);
} else {
return CircularProgressIndicator();
}
},
),
),
),
);
}
}
我有这段代码可以在 flutter 中显示文本中的图像,但是当我使用 ImageShader 时。 我收到这个错误 方法 'asset' 没有为类型 'Image' 定义。尝试将名称更正为现有方法的名称,或定义名为 'asset'
的方法我也提到过这个Repo。这个 repo link 是在 Whosebug 上关于 ImageShader 的先前问题中给出的。
我知道“dart:ui”不包含任何资产方法。所以我使用了 Image.asset 但是当我使用这个方法时我得到了这个错误。
The argument type 'Image (where Image is defined in /Users/username/Developement/flutter/packages/flutter/lib/src/widgets/image.dart)' can't be assigned to the parameter type 'Image (where Image is defined in /Users/username/Developement/flutter/bin/cache/pkg/sky_engine/lib/ui/painting.dart)'
Link to the similar question asked on Whosebug
import 'dart:ui' as ui;
class _MyAppState extends State<MyApp> {
Float64List matrix4 = new Matrix4.identity().storage;
ui.Image img;
Future<ui.Image> getImage() async{
img = await ui.Image.asset("assets/images/ob_girl_cropped.png"); // This Line Is showing error. Please Help.
}
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: Scaffold(
body: Center(
child: FutureBuilder(
future: getImage(),
builder: (context, snapshot)
{
if(snapshot.hasData){
return Text(
'Greetings, planet!',
style: TextStyle(
fontSize: 40,
foreground: Paint()
..shader = ImageShader(
img,
TileMode.clamp,
TileMode.clamp,
matrix4),
),
);
}
else{
return CircularProgressIndicator();
}
},
),
),
),
);
}
}
两个问题:
- 加载图像的方式,我写了一个
loadImageFromFile
辅助函数 - 你不应该把
getImage()
直接放在future
字段中,因为每次重建页面时flutter都会创建一个新的未来(所以多次加载图像)
完整代码:
import 'dart:typed_data';
import 'package:flutter/services.dart' show rootBundle;
import 'package:flutter/material.dart';
import 'dart:ui' as ui;
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Float64List matrix4 = new Matrix4.identity().storage;
Future<ui.Image> imgFuture;
// New helper function
Future<ui.Image> loadImageFromFile(String path) async {
var fileData = Uint8List.sublistView(await rootBundle.load(path));
return await decodeImageFromList(fileData);
}
@override
void initState() {
imgFuture = loadImageFromFile("assets/images/ob_girl_cropped.png"); // Works now
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: Scaffold(
body: Center(
child: FutureBuilder(
future: imgFuture,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(
'Greetings, planet!',
style: TextStyle(
fontSize: 40,
foreground: Paint()..shader = ImageShader(snapshot.data, TileMode.clamp, TileMode.clamp, matrix4),
),
);
} else {
return CircularProgressIndicator();
}
},
),
),
),
);
}
}